Bonjour,
Je vous propose une nouvelle procédure à utiliser : LookupLabelRange qui ajoute une colonne à une liste de données en faisant référence à la colonne d'une autre liste par la fonction INDEX ou par le résultat de cette formule.
Petite explication
Fonction effectuant depuis une plage (SourceData) une recherche dans une autre plage (LookupData) en fonction d'une étiquette de colonne (LookupLabel).
Pour que cette recherche soit possible une clé unique (KeyLabel) doit exister dans les deux plages
Si l'argument KeyLabel est vide, la recherche s'effectue sur la première colonne de [LookupData] en cherchant la valeur de la colonne A.
Si l'argument LookupLabel n'est pas trouvé dans LookupData un message est renvoyé à l'utilisateur et la procédure est interrompue sans heurts.
Si l'argument facultatif ValueOnly (True par défaut) est à False, la formule de recherche est gardée
Pour cet exemple, illustré par les images et cette syntaxe
La formule dans la colonne $H$2:$H$16 de la feuille nommée [dbGeneral]
Code : Sélectionner tout - Visualiser dans une fenêtre à part LookupLabelRange shtReference, shtDbAddress, LookupLabel:="adresse", ValueOnly:=False
La propriété NumberFormat de la première cellule cellule de la plage source est également copiée sur l'ensemble de la colonne cible.
Code : Sélectionner tout - Visualiser dans une fenêtre à part =INDEX(dbAddress!$A$2:$F$16; EQUIV($A2; dbAddress!$A$2:$A$16; 0); 4)
Elle renvoie un objet Range représentant la plage de la liste avec la colonne nouvellement créée.
Les arguments (Cinq arguments dont deux facultatifs).
SourceData (Object) : Peut-être de type WorkSheet ou Range. Plage où doit se trouver le résultat de la recherche (Données + Ligne des titres)
LookupData (Object) : Table de recherche (Données + Ligne des titres
LookupLabel (String) : Etiquette de colonne
[KeyLabel] (String) : Etiquette de référence (Première colonne si omis)
[ValueOnly] (Booléen) : (d:=True) doit garder le résultat, Si False garde la formule
La syntaxe
Résultat à la fin de la procédure
Un classeur à télécharger avec des exemples
Six exemples dans le classeur de démonstration à télécharger
Malgré le soin apporté à la programmation de cette procédure et aux multiples tests réalisés, il est possible qu'il subsiste un bogue qui m'aurait échappé.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 Sub Exemples() Dim rngLookup As Range With ThisWorkbook Set rngLookup = .Worksheets("dbAddress").Range("A1").CurrentRegion End With ' Exemple 1 - L'étiquette "Ville" (argument LookupLabel) n'existe pas dans la feuille dbAddress LookupLabelRange SourceData:=shtReference, LookupData:=rngLookup, LookupLabel:="Ville" ' Exemple 2 - L'étiquette "myId" passé par l'argument KeyLabel n'est pas présent LookupLabelRange SourceData:=shtReference, LookupData:=rngLookup, LookupLabel:="adresse", KeyLabel:="myId" ' Exemples suivants, Arguments correctement passés. ' ... Exemple 3 - Colonne "adresse" ajoutée en gardant formule (ValueOnly à False) LookupLabelRange SourceData:=shtReference, LookupData:=rngLookup, LookupLabel:="adresse", ValueOnly:=False ' Exemples 4 et 5 - Le tableau commence en cellule G4 de la feuille [dbDateNaiss] ' et les références ("id") ne sont pas toutes présentes, si formule gardée renvoie erreur -> #N/A ' ... Exemple 4 - Colonne "CA" LookupLabelRange shtReference, shtdb2.Range("G4"), LookupLabel:="CA", ValueOnly:=False ' ... Exemple 5 - Colonne "DateNaiss" LookupLabelRange shtReference, shtdb2.Range("G4"), LookupLabel:="Date Naiss" ' ... Exemple 6 - Colonne "Enfant" dont les valeurs sont 0 ou -1 ' un format personnalisé (;"Oui";"Non") est appliqué LookupLabelRange shtReference, shtDbAddress, LookupLabel:="Enfant" End Sub
Vos réactions sont les bienvenues
Partager