VBA - Boucle de Recherche pour compléter une colonne donnée
Bonjour à tous,
Je me sens un peu idiot de ne pas pouvoir trouver comment aborder ce problème.
Je dépose un fichier afin de clarifier mes propos.
Je souhaiterais créer une boucle me permettant de compléter une colonne "Pays" à partir de la colonne "Pays d'Origine" indiquée 1 fois par code pour l'ensemble des lignes ayant le même "Code" identique.
Regarder le fichier pour mieux comprendre le résultat attendu :
Ma problématique est : Déjà je suis novice en VBA
- Quelle est la meilleure boucle à utiliser.
- Comment présenter le code : (Recherche l'iso pays du pays d'origine, applique ce code iso pour l'ensemble du "Code" unique sur toutes les lignes ayant le même code.
Voilà si vous avez un bout d'explication et/ou un début de code de traitement je devrais pouvoir réussir à bricoler qqc.
Merci d'avance de votre retour. :-)
Excellente journée
Bonjour,
Et meilleurs vœux...
Tout d'abord, il serait bien que tu mettes dans ton profil la version d'Excel que tu utilises (elle apparaîtra sous ton avatar)
Si tu as >=2016, tu peux utiliser Power Query (si tu as 2010 ou 2013, tu peux télécharger l'Add-On gratuit sur le site de µSoft)
Regarde ce que ça pourrait donner
Bonne journée
Edit : Fichier supprimé, solution non fiable... Voir plus bas
Re-,
PS, cette proposition ne peut fonctionner à 100% que si tous les codes ont au moins un pays d'origine...
Mais je ne doute pas que la solution via PQ existe
Désolé
Bonjour,
Après modifications de la requête, voici ce que tu peux obtenir via Power Query
Un clic droit sur le Tableau Final, "Actualiser" pour mettre à jour
Bonne journée
Bonjour,
Si vous tenez à utiliser une boucle en VBA, (la solution avec POWER QUERY étant bien meilleure), il vous suffit de faire en premier lieu, un tri descendant par code et Pays d'origine et, il ne reste plus qu'à appliquer une boucle pour remplir la colonne "Pays".
Sub Pays()
Dim DerLig As Long, i As Long, Lig As Long
Dim Code As String, Pays_Or As String
Application.ScreenUpdating = False
DerLig = Range("B" & Rows.Count).End(xlUp).Row
'Tri descendant par code et pays d'origine
ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Add Key:=Range("B4:B" & DerLig), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Add Key:=Range("C4:C" & DerLig), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Feuil1").Sort
.SetRange Range("B3:D" & DerLig)
.Header = xlYes
.Apply
End With
'Remplissage
For i = 4 To DerLig
If Cells(i, "C") <> "" Then
Code = Cells(i, "B")
Pays_Or = Cells(i, "C")
Lig = i
Do While Cells(Lig, "B") = Code And Lig <= DerLig
Cells(Lig, "D") = Pays_Or
Lig = Lig + 1
Loop
i = Lig - 1
End If
Next i
End SubCeci n'étant que pour s'amuser à coder, la solution avec POWER QUERY est largement plus satisfaisante.
Cdlt
Edit: ou en plus court:
Sub Pays()
Dim DerLig As Long, i As Long, Lig As Long
Dim Code As String, Pays_Or As String
Application.ScreenUpdating = False
DerLig = Range("B" & Rows.Count).End(xlUp).Row
'Tri descendant par code et pays d'origine
Worksheets("Feuil1").Sort.SortFields.Clear
Worksheets("Feuil1").Range("B3:C" & DerLig).Sort Key1:=Range("B3"), Key2:=Range("C3"), Header:=xlYes, Order1:=xlAscending, Order2:=xlAscending
For i = 4 To DerLig
If Cells(i, "C") <> "" Then
Code = Cells(i, "B")
Pays_Or = Cells(i, "C")
Lig = i
Do While Cells(Lig, "B") = Code And Lig <= DerLig
Cells(Lig, "D") = Pays_Or
Lig = Lig + 1
Loop
i = Lig - 1
End If
Next i
End SubBonjour,
Une proposition 365 et 2021 (non optimisée) pour le fun et se passer de VBA ou de Power Query.
Cdlt.
Bonsoir à tous,
Un brin de VBA sans trier
Option Explicit
Sub Remplir()
Dim r As Range, i As Long, j As Long, k
With Sheets("Feuil1")
Set r = .Range("b4", .Cells(.Rows.Count, "b").End(xlUp))
For i = 1 To r.Count
j = 1
Do Until r(i) <> r(i).Cells(j)
If Not IsEmpty(r(i).Cells(j).Offset(, 1)) Then
k = r(i).Cells(j).Offset(, 1).Value
End If
j = j + 1
Loop
.Range(r(i), r(i).Cells(j - 1)).Offset(, 2).Value = k
i = i + j - 2: k = ""
Next i
End With
End Subklin89
Wahouuuu,
Je suis impressionné.
3 Solutions différentes et 3 solutions qui fonctionnent.
Klin89 : Ta solution en VBA est la plus courte. Et fonctionne très bien. Il faut que regarde pas à pas. Je suis un peu perdu dans les r, j, i, k. Mais c'est parfait Merci beaucoup.
Jean-Eric : Merci pour ta proposition. La proposition est intéressante si il n'y a qu'un seul appel de pays. Merci à toi.
Arturo83 : Merci pour les 2 codes ils fonctionnent très bien tous les deux. Idem à Klin89 il faut que je regarde pas à pas. Autre approche mais même résultat. C'est parfait merci à toi.
CousinHub : Génial, je n'ai encore jamais utilisé le PowerQ, il n'y a pourtant pas beaucoup de fonctions affichées. Cela t'a pris quoi, 2-3 Minutes ?
Lorsque je suis dans Power Pivot a partir de la base sélectionné : Tu pourrais m'indiquer les quelques étapes que tu as sélectionnées pour obtenir le résultat, que je comprenne cette méthode. Qui pourrait être appliqué pour un grand volume.
Bien à vous tous.
Excellente journée. ;-)
Bonjour,
(Pour info, j'ai supprimé mon premier fichier, non fiable)
Dans le 2ème :
- Clic droit sur le Tableau/Table/Modifier la requête (tu arrives dans l'éditeur PQ)
- Comme tu peux le voir, il y a 2 tableaux à gauche :
Pour T_Codes, les étapes à droite :
- La source (la même que pour T_Final)
- J'ai regroupé par Code, Filtré pour supprimer les "null", et supprimé la colonne Nombre
- Ce Tableau va me servir pour la fusion dans le T_Final
Pour T_Final :
- Toujours la même source
- Supprimer la colonne "Pays"
- Fusionner les 2 tableaux, en prenant en colonne de fusion, la 1ère (Code)
- Et développer les "Tables" de la colonne "T_Codes" en cliquant sur la double flèche
Et c'est tout...
Bon courage
Bonjour,
@FranckO22,
Jean-Eric : Merci pour ta proposition. La proposition est intéressante si il n'y a qu'un seul appel de pays. Merci à toi.
Peux-tu expliquer ta remarque ?
Cdlt.
Bonjour à tous !
Pour le "fun", une formule unique et dynamique pour Excel 365 (Insider ?)
Génial,
CousinHub : Génial merci pour les screenshot d'exemples c'est super. Un grand merci à toi. :-)
Jean-Eric : J'aurais pu effectivement utiliser cette méthode. Mais je pourrais très bien avoir plusieurs Codes différents pour un même Pays.
Donc le fait d'utiliser une Table d'imputation est une excellente idée, si il y a un seul code pour un retour.
Si je prends les codes suivant pour le Pays "FR" :
12345 ==> FR
45678==> FR
Dans ce cas la Table d'imputation n'a plus d'intérêt. J'ai X Code pour un item de retour.
JFL :
Wahoo mais c'est génial ça aussi. Je n'avais pas trouvé d'exemple avec RechercheX mais je savais que je pouvais faire un truc.
Chapeau celui-là, je l'aurais jamais trouvé. ;-).
Je vais tester aussi cette petite formule. Je ne connaissais pas du tout 'LET'.
Même à 50 balais en apprend encore tous les jours.
Bravo les gars vous êtes des champions. Mille MERCI pour votre aide, les découvertes de l’outil et globalement les échanges de connaissances.
RESOLU X 4