2 pièce(s) jointe(s)
LookupLabelRange - Ajouter une colonne à une liste de données
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
Code:
LookupLabelRange shtReference, shtDbAddress, LookupLabel:="adresse", ValueOnly:=False
La formule dans la colonne $H$2:$H$16 de la feuille nommée [dbGeneral]
Code:
=INDEX(dbAddress!$A$2:$F$16; EQUIV($A2; dbAddress!$A$2:$A$16; 0); 4)
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.
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
Pièce jointe 151011
Résultat à la fin de la procédure
Pièce jointe 151012
Un classeur à télécharger avec des exemples
Six exemples dans le classeur de démonstration à télécharger
Code:
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 |
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é.
Vos réactions sont les bienvenues