Code VBA

Cat&Dom -  
eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

Je voudrais écrire un code pour récupérer un libellé.

Dans le tableau ci-dessous, je voudrais parcourir la colonne "B", chaque fois que la valeur commence par "41110", me déplacer dans la colonne "C", copier la valeur, me déplacer dans la colonne "F" pour repérer le n° de pièce et parcourir cette même colonne pour rechercher toutes les cellules ayant le même n° de pièce et aller coller en "C" la valeur préalablement copier également en "c". Tous les n° de pièces identiques doivent avoir le même libellé en "C"

[url=https://www.hiboox.com][img]http://images2.hiboox.com/vignettes/4807/slbwxedd.jpg[/img][/url]

J'espère avoir été claire et que quelqu'un pourra m'aider.

Merci d'avance

Catherine
Configuration: Windows XP
AOL 8.0

6 réponses

  1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Bonjour,

    J'ai regardé ton exemple et 2 questions :
    Est-ce 41110 ou 40110 ?
    Et si tu as des libellés différents en C est-on sûr que le 1er rencontré soit le bon ? Le tout est qu'ils soient identiques si les conditions sont remplies ?

    eric
    0
  2. Cat&Dom
     
    Bonjour,

    J'ai vu que j'avas fait erreur par rapport à mon tableau, mais je vais avoir les deux cas, cette macro doit me permettre de faire des filtres dans des journaux comptables de ventes ou d'achat.

    Il faut effectivement que je retrouve le libellé qui se trouve sur la ligne des comptes qui commencent par 40110 ou 41110 sur chaque ligne du même n° de pièce. Je vais effectivement perdre les libellés des comptes mais ce n'est pas important.

    Merci de t'intéresser à mon cas, je débute en VBA et je galère beaucoup.

    Coridialement

    Catherine
    0
  3. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Voici une proposition.
    Je te laisse le soin de tout tester car je n'ai pas eu le temps de préparer une feuille avec des données de test exhaustive. Et toi seule connait les différents cas de figure à tester.
    Pour ne pas faire trop lourd j'ai considéré que toutes les cellules étaient remplies. S'il y a des cellules vides en B, C et F il y aura sûrement des contrôles à rajouter pour éviter les messages d'erreur.
    Si tu dois faire ce traitement régulièrement le mieux est de coller ce code dans un module d'un autre classeur.
    Quand tu lances la macro elle travaille sur la fenetre active.
    Sub modif()
        Dim cte As String, msg As String
        Dim derCel As Range
        Dim datas() As Variant
        Dim nbval As Long, i As Long, j As Long, nb As Long
        nb = 300
        ReDim datas(nb, 2) ' lig, cte, lib, piece
        msg = "Saisir les 5 premiers caractères du compte" & vbCrLf
        msg = msg & "(00000 pour quitter sans traitement)"
        Do
            cte = InputBox(msg, "Saisie compte")
        Loop Until Len(cte) = 5
        If cte = "00000" Then Exit Sub
        Set derCel = [B65536].End(xlUp)
        ' passe1
        For Each cel In Range("B1", derCel)
            If Left(CStr(cel), 5) = cte Then
                nbval = nbval + 1
                datas(nbval, 0) = cel.Row 'ligne
                datas(nbval, 1) = cel.Offset(0, 1).Value ' libellé
                datas(nbval, 2) = cel.Offset(0, 4).Value 'pièce
                If nbval = nb Then ' extension du tableau
                    nb = nb + 100
                    ReDim datas(nb, 2)
                End If
            End If
        Next cel
        ' passe2
        For i = 1 To nbval
            If datas(i, 2) <> "" Then ' ligne non traitée
                For j = i + 1 To nbval
                    If datas(j, 2) = datas(i, 2) Then ' même piece
                        Cells(datas(j, 0), 3).Value = datas(i, 1) ' changer libellé
                        datas(j, 2) = "" ' marque ligne traitée
                    End If
                Next j
            End If
        Next i
    End Sub


    Dis moi si ça colle avec ce que tu veux.
    eric
    0
  4. Cat&Dom
     
    Bonsoir Eric,

    J'ai testé ton code. Lorsque je lance l'exécution à partir de Visual Basic, l'Inputbox s'ouvre bien, si je saisis "00000", je ferme sans traitement, mais si je saisis "41110", rien ne se passe.

    Je ne comprends pas bien l'intérêt de l'inputbox car en fait, je veux simplement (pas si simple !!!) recopier le libellé de la ligne qui contient un nombre commencant par 41110 et le coller sur les lignes contenant le même n° de pièce.

    Je vais essayer de décortiquer ton code, sans garantie de succès, je suis vraiment une novice en matière de VBA. Mais si tu pouvais m'en dire plus, ton aide sera la bienvenue.

    Merci

    Coridialement

    Catherine
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Bonsoir,

    J'avais quand même testé sur une mini feuille basée sur ton exemple et ça tournait.
    J'ai mis l'inputbox car tu as dit devoir traiter 40110 et 41110, c'est la saisie attendue (5 car.).
    Sinon tu enlèves ces lignes et tu remplaces par une constante si tu veux.
    Const cte as string = "41110"

    Fais le en pas à pas pour voir si tu sors de façon prématurée mais je ne vois pas pourquoi là...

    eric
    0
  7. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Le principe est le suivant:
    -passe 1
    Je balaye la colonne B à la recherche des comptes commençants par cte (41110),
    Si ok je mémorise dans le tableau datas() le n° de ligne, le libellé(col. C) et le n°de pièce (col. F)
    -passe 2
    pour chaque ligne mémorisée je contrôle si le n° piece n'est pas vide (tu verras pourquoi plus bas)
    si non vide: de la ligne suivante jusqu'à la dernière, si le n° de piece est identique je remplace le libellé (col. C), et je vide le n° de piece dans le tableau pour la marquer et ne plus faire de traitement inutile dessus
    voilà.

    eric
    0
    1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
       
      Ca serait bien si tu avais une feuille de test plus complète que je regarde (allégée des données confidentielles). Tu peux la déposer sur www.cijoint.fr et coller le lien ici
      0