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.
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 !