Téléchargé 8 fois
Vote des utilisateurs
1
0
Détails
Licence : Gratuit pour usage non commercial
Mise en ligne le 16 juillet 2014
Plate-forme :
Windows
Langue : Français
Référencé dans
Navigation
Ajouter une colonne à une liste de données
Ajouter une colonne à une liste de données
Voici le code d'une procédure 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.
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
INDEX ou par le résultat de cette formule.
La procédure est une fonction nommée LookupLabelRange qui renvoie un objet Range représentant la plage de la liste avec la colonne nouvellement créée.
LES ARGUMENTS
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)
' Si Etiquette réference de SourceData LookupData
indiquer les 2 valeurs séparées par ; (exemple: KeyLabel:="Id;Id_FK")
[ValueOnly] (Booléen) : (d:=True) doit garder le résultat, Si false garde la formule
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
INDEX ou par le résultat de cette formule.
La procédure est une fonction nommée LookupLabelRange qui renvoie un objet Range représentant la plage de la liste avec la colonne nouvellement créée.
LES ARGUMENTS
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)
' Si Etiquette réference de SourceData LookupData
indiquer les 2 valeurs séparées par ; (exemple: KeyLabel:="Id;Id_FK")
[ValueOnly] (Booléen) : (d:=True) doit garder le résultat, Si false garde la formule
Bonjour Philippe,
Après analyse, il y a un autre avantage aussi sur ta fonction : la suppression de colonne n'impactera pas le résultat de la recherche.
En effet, lorsque l'on effectue une RECHERCHEV, le troisième argument est fixe, est n'est pas modifiant suite à la suppression d'une colonne.
L'avantage de ta solution est qu'elle prend le titre des colonnes, et non le numéro de celle-ci
Par contre, dans ton classeur exemple, il y a une faute de frappe dans ton image pour la formule. Tu as écrit ça :
Ta feuille ne s'appelle pas dbAddresse, mais dbAddress
Après analyse, il y a un autre avantage aussi sur ta fonction : la suppression de colonne n'impactera pas le résultat de la recherche.
En effet, lorsque l'on effectue une RECHERCHEV, le troisième argument est fixe, est n'est pas modifiant suite à la suppression d'une colonne.
L'avantage de ta solution est qu'elle prend le titre des colonnes, et non le numéro de celle-ci
Par contre, dans ton classeur exemple, il y a une faute de frappe dans ton image pour la formule. Tu as écrit ça :
Code : | Sélectionner tout |
LookupLabelRange SourceData:=Worksheets("dbGeneral"), LookupData:=Worksheets("dbAddresse"), LookupLabel:="Adresse", KeyLabel:="id"
Bonjour Philippe,
Ne serait-ce pas un équivalent d'une simple RECHERCHEV ? Pourquoi utiliser une macro quand une fonction propre à Excel existe déjà ?
Alors effectivement, quand on a un gros fichier, il est évident que ta fonction sera surement plus rapide qu'utiliser la RECHERCHEV, qui mettra des plombes à calculer.
Merci pour ta réponse
Ne serait-ce pas un équivalent d'une simple RECHERCHEV ? Pourquoi utiliser une macro quand une fonction propre à Excel existe déjà ?
Alors effectivement, quand on a un gros fichier, il est évident que ta fonction sera surement plus rapide qu'utiliser la RECHERCHEV, qui mettra des plombes à calculer.
Merci pour ta réponse
Bonjour Olivier,
Merci pour ta question.
Ce n'est pas tout à fait l'équivalent d'un RECHERCHEV mais c'est assez proche.
J'utilise la combinaison de INDEX et EQUIV qui est moins contraignante et plus puissante que RECHERCHEV. Elle permet notamment la recherche sur une autre colonne que la première.
Le masque de formule que j'utilise
après modification cela donne (pour l'exemple affiché)
Alors oui, on peut le faire manuellement mais je l'ai développé surtout évidemment dans le but de rapatrier rapidement sur une seule feuille des données qui seraient éparpillées sur plusieurs feuilles. D'ailleurs, par défaut la fonction conserve la valeur et pas la formule
J'avais lu quelques questions sur le forum traitant de ce sujet ce qui m'a donné l'idée de développer cette fonction.
Merci pour ta question.
Ce n'est pas tout à fait l'équivalent d'un RECHERCHEV mais c'est assez proche.
J'utilise la combinaison de INDEX et EQUIV qui est moins contraignante et plus puissante que RECHERCHEV. Elle permet notamment la recherche sur une autre colonne que la première.
Le masque de formule que j'utilise
Code : | Sélectionner tout |
=INDEX(<LookupTable>, MATCH(<RefId>, <Row>, 0), <Col>)
Code : | Sélectionner tout |
=INDEX(dbAddress!$A$2:$F$16; EQUIV($A2; dbAddress!$A$2:$A$16; 0); 4)
J'avais lu quelques questions sur le forum traitant de ce sujet ce qui m'a donné l'idée de développer cette fonction.
Bonjour Olivier,
Je te remercie pour ta bonne observation.
J'ai effectué la modification et remplacé le classeur à télécharger et comme j'avais déjà ajouté une fonctionnalité supplémentaire à cette procédure, le classeur contient la nouvelle version 2.1
Maintenant, si la clé de référence est différente dans les deux tables, on peux indiquer dans l'argument [KeyLabel] le nom des deux étiquettes séparé par un point virgule.
Exemple :
[EDIT]
Je ne sais pas si j'ai bien compris cette remarque mais tu peux également utiliser la fonction EQUIV comme troisième argument de la formule RECHERCHEV afin de rendre dynamique la position de l'étiquette recherchée.
Exemple : (Toujours avec les deux fichiers de l'illustration)
Par contre, dans ton classeur exemple, il y a une faute de frappe dans ton image pour la formule.
J'ai effectué la modification et remplacé le classeur à télécharger et comme j'avais déjà ajouté une fonctionnalité supplémentaire à cette procédure, le classeur contient la nouvelle version 2.1
Maintenant, si la clé de référence est différente dans les deux tables, on peux indiquer dans l'argument [KeyLabel] le nom des deux étiquettes séparé par un point virgule.
Exemple :
Code : | Sélectionner tout |
1 2 3 4 5 6 | Sub Exemple7() With ThisWorkbook LookupLabelRange .Worksheets("dbGeneral"), .Worksheets("dbCars"), _ LookupLabel:="Véhicule", keyLabel:="Id;General_FK" End With End Sub |
En effet, lorsque l'on effectue une RECHERCHEV, le troisième argument est fixe
Exemple : (Toujours avec les deux fichiers de l'illustration)
Code : | Sélectionner tout |
=RECHERCHEV(A2;dbAddress!$A$2:$F$16;EQUIV("Adresse";dbAddress!$A$1:$F$1;0))
Tu as parfaitement compris mon problème, et je te remercie pour la solution. Il faudra que je teste cette fonction à l'occasion
En tout cas, je vais mettre ton classeur dans mes favoris, car j'ai souvent des recherches de ce genre à faire
Maintenant, faut que je me prenne du temps pour comprendre la fonction (j'aime bien comprendre ), parce que je l'ai lu 2 fois, j'ai pas tout compris
En tout cas, je vais mettre ton classeur dans mes favoris, car j'ai souvent des recherches de ce genre à faire
Maintenant, faut que je me prenne du temps pour comprendre la fonction (j'aime bien comprendre ), parce que je l'ai lu 2 fois, j'ai pas tout compris
Developpez.com décline toute responsabilité quant à l'utilisation des différents éléments téléchargés.