Aide VBA

Bonjour,

Dans le fichier ci-joint, j'ai une formule matricielle qui va chercher des infos dans la feuille DATA en fonction des variables en B1/B2/B3.

J'ai essayé une macro, qui ne marche malheureusement pas.

Le but final est d'avoir le même résultat qu'en feuil3 (TCD).

Quelqu'un pourrait-il m'aider?

En vous remerciant.

max

Hello,

Tu as oublié de valider l'upload du fichier

SoumZoum a écrit :

Hello,

Tu as oublié de valider l'upload du fichier

ah oui, désolé!!

Le voici

Max

8max-6546-2.xlsx (65.78 Ko)

Bonjour,

La formule est bonne. Il a simplement qu'elle avait été tirée prématurément (ou sans rectif ultérieure) à partir de la première colonne, donc le M est devenu N pui O (mais pas AA et AB comme voulus).

Comme il m'a fallu un peu de temps pour comprendre, vu que la formule en soi était correcte et ne devait pas donner un résultat faux, je me suis occupé à quelques simplifications visuelles : j'ai dégagé la matrice de numéros de lignes utilisée par la fonction PETITE.VALEUR en formule nommée MatRech (on peut donner des noms à des formules), nom qui remplace cette matrice dans la formule.

Cela ne change rien au résultat, c'est toujours la même formule, mais visuellement on voit du premier coup comment elle est construite...

Cordialement

Ferrand

15max-6546-2.xlsx (67.57 Ko)
MFerrand a écrit :

Bonjour,

La formule est bonne. Il a simplement qu'elle avait été tirée prématurément (ou sans rectif ultérieure) à partir de la première colonne, donc le M est devenu N pui O (mais pas AA et AB comme voulus).

Comme il m'a fallu un peu de temps pour comprendre, vu que la formule en soi était correcte et ne devait pas donner un résultat faux, je me suis occupé à quelques simplifications visuelles : j'ai dégagé la matrice de numéros de lignes utilisée par la fonction PETITE.VALEUR en formule nommée MatRech (on peut donner des noms à des formules), nom qui remplace cette matrice dans la formule.

Cela ne change rien au résultat, c'est toujours la même formule, mais visuellement on voit du premier coup comment elle est construite...

Cordialement

Ferrand

Bonjour,

Merci Ferrand, ta formule est beaucoup plus simple.

Mais ma question que j'ai mal formulée, est de savoir si on peut remplacer cette formule matricielle par une Macro, car les données vont s'empiler, ce qui va générer un temps de calcul relativement long.

Merci

Max

Bien sûr, possible par macro.

C'est fait mais pas testé (et je préfére attendre demain pour ça).

Cordialement

Ferrand

Bonjour,

Même recherche par macro dans fichier joint. Attention, les critères de recherche mentionnés dans la zone jaune, ainsi que l'en-tête de la zone de résultats, doivent être strictement identiques à ce qu'ils sont dans la base, sans quoi ils ne seront pas trouvés et tu déboucheras probablement sur des erreurs ou des résultats inattendus.

Mon débogage a dû commencer par là : les noms de champs de 2 critères de recherche étaient faux...

Ce qui m'a permis de noter que nombre de tes données dans la base se terminaient par une espace. Le même mot (mais sans espace) apparaîtra identique à l'oeil mais sera autre pour VBA...

Deux mots sur la façon dont procède la macro (j'ai pris en compte ton indication que la base était appelée à grossir...) :

• Hors macro proprement dite, plages nommées :

  • DataAll = ta base (non compris l'en-tête), définie dynamiquement : c'est à dire que tu peux l'étendre vers le bas et vers la droite (si tu ajoutes des champs), le nom continuera de la recouvrir ;
  • DataLbl = la ligne d'en-tête de la base, également définie dynamiquement ;
  • Critr = la zone de critères de la recherche (jaune) ;
  • Résult = l'en-tête de la zone de résultats (noms de champs à renvoyer, en bleu clair).
Tous les noms sont utilisés dans la macro.

• La macro commence par effacer la recherche antérieure et monte un tableau de critères (crt) dans laquel pour chaque critère, elle prélève la valeur du critère, recherche la colonne de la base concernée, calcule le nombre d'enregistrement répondant au critère.

Elle recherchera aussi les colonnes correspondant aux critères à renvoyer (stockés dans le même tableau).

• Elle prend le critère le moins représenté (plus petit nombre d'enregistrements) pour dimensionner un tableau de résultats (rés) et trier la base sur ce critère, ce qui limite le nombre de lignes à tester sur l'ensemble des critères.

• Ensuite, on revient à un déroulement ordinaire : prélèvement des données recherchées et affichage dans la zone de résultats.

Cordialement

Ferrand

8max-6546-2.xlsm (80.63 Ko)
MFerrand a écrit :

Bonjour,

Même recherche par macro dans fichier joint. Attention, les critères de recherche mentionnés dans la zone jaune, ainsi que l'en-tête de la zone de résultats, doivent être strictement identiques à ce qu'ils sont dans la base, sans quoi ils ne seront pas trouvés et tu déboucheras probablement sur des erreurs ou des résultats inattendus.

Mon débogage a dû commencer par là : les noms de champs de 2 critères de recherche étaient faux...

Ce qui m'a permis de noter que nombre de tes données dans la base se terminaient par une espace. Le même mot (mais sans espace) apparaîtra identique à l'oeil mais sera autre pour VBA...

Deux mots sur la façon dont procède la macro (j'ai pris en compte ton indication que la base était appelée à grossir...) :

• Hors macro proprement dite, plages nommées :

  • DataAll = ta base (non compris l'en-tête), définie dynamiquement : c'est à dire que tu peux l'étendre vers le bas et vers la droite (si tu ajoutes des champs), le nom continuera de la recouvrir ;
  • DataLbl = la ligne d'en-tête de la base, également définie dynamiquement ;
  • Critr = la zone de critères de la recherche (jaune) ;
  • Résult = l'en-tête de la zone de résultats (noms de champs à renvoyer, en bleu clair).
Tous les noms sont utilisés dans la macro.

• La macro commence par effacer la recherche antérieure et monte un tableau de critères (crt) dans laquel pour chaque critère, elle prélève la valeur du critère, recherche la colonne de la base concernée, calcule le nombre d'enregistrement répondant au critère.

Elle recherchera aussi les colonnes correspondant aux critères à renvoyer (stockés dans le même tableau).

• Elle prend le critère le moins représenté (plus petit nombre d'enregistrements) pour dimensionner un tableau de résultats (rés) et trier la base sur ce critère, ce qui limite le nombre de lignes à tester sur l'ensemble des critères.

• Ensuite, on revient à un déroulement ordinaire : prélèvement des données recherchées et affichage dans la zone de résultats.

Cordialement

Ferrand

Bonjour Ferrand,

Un grand merci car c'est exactement ce que je cherchais.

J'aurai juste une dernières questions, est-il possible de compiler une seule référence sur une seule ligne comme le fait le le TCD?

Encore merci, le résultat est très bien.

Max

Attends ! Tu as demandé une macro qui fasse ce que faisait la formule.

Elle est donc réglée pour rechercher sur 3 critères, s'il lui en manque 1, elle interrompt l'opération.

Et elle extrait 3 valeurs, s'il lui en manque, tu auras une erreur d'exécution (ça, parce que j'ai oublié de verrouiller aussi les paramètres d'extraction, donc elle cherchera une valeur vide pour déterminer la colonne... d'où nécessairement erreur).

Si ta demande était de faire varier le nombre de critères et de paramètres d'extraction, il fallait le formuler au départ !

On n'est plus dans une macro effectuant une opération ponctuelle, mais presque dans un programme de recherche avec options multiples (car en cherchant on trouve toujours des options à rajouter, sauf que ça se rajoute pas toujours très bien et qu'il est souvent préférable de reprendre la conception).

Je te refais passer le fichier avec l'oubli signalé plus haut rectifié (ça évitera une erreur intempestive possible).

Ceci étant, tu peux sans doute essayer de l'utiliser avec 2 critères (voire un) en rusant : en en mentionnant 1 deux fois (voire trois). Et même chose pour les paramètres d'extractions, tu en doubles 1 ou tu mets le même sur les 3 cellules de l'en-tête bleu clair, Elle sortira la même valeur sur 2 ou 3 colonnes mais tu auras ce que tu recherches.

Cordialement

Ferrand

12max-6546-2.xlsm (80.76 Ko)
Rechercher des sujets similaires à "aide vba"