VBA - RechercheH avec colonne en double

Bonjour à tous,

Je cherche à dynamiser le remplissage d’un classeur avec des rechercheH. En effet, j’ai une « base » Excel, avec une cinquantaine de variables. Avec cette base, un outil d’extraction a été créé et permet de filtrer les variables selon ce que l’on veut.

Jusqu’alors, je n’avais pas pensé au fait que la base pouvait contenir plusieurs fois le même entête de colonne (mais pas la même donnée… Super) et alors générer une recherche fausse quand le cas se présente.

Mon idée est alors de créer une boucle qui compte le nombre d’occurrence d’une cellule sur la ligne des titres de la cellule A1 à la cellule Ax (x = dernière colonne non vide) et de déclarer une plage de données dynamique pour réaliser ma rechercheH sans « double ».

Par exemple, si en cellule F1, la valeur existe déjà, alors la plage de données sera F1 :H1 au lieu de A1 :H1.

Ma sélection se réalise bien, mais c’est la rechercheH qui coince : je n’ai que la première colonne qui se calcule. Je pense que c'est un soucis dans mes boucles qui s'entrecroisent mais je n'arrive pas à remettre tout dans l'ordre.

Je sais que cette méthode a des limites (notamment s'assurer que les colonnes "en double" dans le document source sont dans le même ordre que le document "final".).

Merci de votre aide. Si jamais vous avez besoin de mon fichier de travail, dites le moi.

Bonne journée

Sub Doublon()

    Dim Plagedyn As Range
    Dim seldyn As Range
    Dim n, a As Integer
    Dim DernLigne As Long, DernColonne As Integer
    DernLigne = Range("A" & Rows.Count).End(xlUp).Row
    DernColonne = Cells(1, Cells.Columns.Count).End(xlToLeft).Column

    'en colonne "A" à partir de A2
     For j = 1 To DernColonne

     'Plagedyn = colonnes A1:j1
     Set Plagedyn = Range(Cells(1, 1), Cells(1, j))

    If Application.CountIf(Plagedyn, Cells(1, j)) > 1 Then
    Set seldyn = Range(Cells(1, j), Cells(DernLigne, DernColonne))
    For i = 2 To DernLigne
    Sheets("Feuil4").Select
    Cells(i, j) = WorksheetFunction.HLookup(Cells(1, j), seldyn, i, False)
    Next
    Else: Set seldyn = Range(Cells(1, 1), Cells(DernLigne, DernColonne))
    For i = 2 To DernLigne
    Sheets("Feuil4").Select
    Cells(i, j) = WorksheetFunction.HLookup(Cells(1, j), seldyn, i, False)
    Next
    End If

    Next
 End Sub

Bonjour,

Tu n'as pas un petit classeur d'exemple, parce pour trouver l'erreur sans connaitre ton fichier, c'est loin d'être évident. Tu indiques juste ce cloche dans ta macro et le résultat attendu dans une ou plusieurs cellules.

Merci.

Bonjour,

Teste en remplaçant :

Cells(i, j) = WorksheetFunction.HLookup(Cells(1, j), seldyn, i, False)

par :

Cells(i, j) = Application.HLookup(Cells(1, J), seldyn, i, False)

Bonjour,

Merci pour ton 'aiguillage' Theze, mais le problème persiste.

Aussi, trouvez en pièce jointe, le classeur sur lequel je fait des tests.

12classeur1.xlsm (20.21 Ko)

Est ce que c'est ce résultat que tu attends ?

Voici le code qui le donne :

Sub Doublon()

    Dim Fe3 As Worksheet
    Dim Fe4 As Worksheet
    Dim Plagedyn As Range
    Dim seldyn As Range
    Dim I As Integer
    Dim J As Integer
    Dim DernLigne As Long
    Dim DernColonne As Integer

    Set Fe3 = Worksheets("Feuil3")
    Set Fe4 = Worksheets("Feuil4")

    With Fe3 'tous les Ranges précédés d'un point (.) font référence à la varaible Fe3 donc "Feuil3"

        DernLigne = .Range("A" & .Rows.Count).End(xlUp).Row
        DernColonne = .Cells(1, .Cells.Columns.Count).End(xlToLeft).Column

        'en colonne "A" à partir de A2
        For J = 1 To DernColonne

            Set Plagedyn = .Range(.Cells(1, 1), .Cells(1, J))

            If Application.CountIf(Plagedyn, .Cells(1, J)) > 1 Then

                Set seldyn = .Range(.Cells(1, J), .Cells(DernLigne, DernColonne))

                For I = 2 To DernLigne
                    Fe4.Cells(I, J) = Application.HLookup(.Cells(1, J), seldyn, I, False)
                Next I

            Else

                Set seldyn = .Range(.Cells(1, 1), .Cells(DernLigne, DernColonne))

                For I = 2 To DernLigne
                    Fe4.Cells(I, J) = Application.HLookup(.Cells(1, J), seldyn, I, False)
                Next I

            End If

        Next J

    End With

End Sub

Si c'est le bon, sache qu'il faut faire très attention quand on travaille sur deux feuilles !

Sheets("Feuil4").Cells(1, 1)

cette ligne de code fait bien référence à la cellule "A1" de la feuille" Feuil4", par contre :

Cells(1, 1)

Fait bien référence à "A1" mais sur la feuille active qui peut ne pas être "Feuil4" !

Quand tu fais :

Sheets("Feuil4").Select
Cells(I, J) = Application.HLookup(Cells(1, J), seldyn, I, False)

La cellule recevant la valeur retournée par la fonction est bien la cellule visée de "Feuil4" (puisque tu l'as rendue active) mais la fonction "HLookup" utilise la valeur de Cells(1, J) de la feuille "Feuil4" et non celle de la feuille "Feuil3" ! d'où les résultats qui ne te convenait pas.

Pour éviter ce genre d'erreur, il est fortement conseillé de "parenter" les Ranges ce que j'ai fais en utilisant les variables "Fe3" et "Fe4" pour que chaque range dépendent bien de la feuille voulue.

Bonjour et désolée de cette réponse tardive.

Un grand merci à toi de m'avoir permis d'y voir plus clair. Je me doutais bien que ça coinçait "à cause" de l'affichage d'un onglet puis de l'autre.

Bonne journée !

Rechercher des sujets similaires à "vba rechercheh colonne double"