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 Sub

Ceci 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 Sub

Bonjour,
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 Sub

klin89

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 :

image

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 :

image

- 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

image

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

Rechercher des sujets similaires à "vba boucle recherche completer colonne donnee"