Code VBA

Fermé
Cat&Dom - 26 nov. 2007 à 20:23
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 8 mai 2024 - 27 nov. 2007 à 22:17
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
A voir également:

6 réponses

eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 8 mai 2024 7 216
27 nov. 2007 à 07:32
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
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
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 8 mai 2024 7 216
27 nov. 2007 à 16:26
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
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 8 mai 2024 7 216
27 nov. 2007 à 22:02
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
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 8 mai 2024 7 216
27 nov. 2007 à 22:10
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
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 8 mai 2024 7 216
27 nov. 2007 à 22:17
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