Code VBA
Fermé
Cat&Dom
-
26 nov. 2007 à 20:23
eriiic Messages postés 24601 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 25 novembre 2024 - 27 nov. 2007 à 22:17
eriiic Messages postés 24601 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 25 novembre 2024 - 27 nov. 2007 à 22:17
A voir également:
- Code VBA
- Code asci - Guide
- Code puk bloqué - Guide
- Code telephone oublié - Guide
- Code activation windows 10 - Guide
- Code gta 4 ps4 - Guide
6 réponses
eriiic
Messages postés
24601
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
25 novembre 2024
7 243
27 nov. 2007 à 07:32
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
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
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
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
eriiic
Messages postés
24601
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
25 novembre 2024
7 243
27 nov. 2007 à 16:26
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.
Dis moi si ça colle avec ce que tu veux.
eric
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
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
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
eriiic
Messages postés
24601
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
25 novembre 2024
7 243
27 nov. 2007 à 22:02
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
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
eriiic
Messages postés
24601
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
25 novembre 2024
7 243
27 nov. 2007 à 22:10
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
-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
eriiic
Messages postés
24601
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
25 novembre 2024
7 243
27 nov. 2007 à 22:17
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