Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/12/2011, 09h43   #1
Invité régulier
 
Homme
Inscription : novembre 2011
Messages : 85
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : novembre 2011
Messages : 85
Points : 5
Points : 5
Par défaut trouver une cellule qui respecte 2 vlookup

bonjour a tous, je me trouve dans un cas ou une vlookup ne me suffit pas, je vous explique,

dans ma colonne a ( nommé: parent) se trouve plein de ligne, dans ma colonne B ( nommé designation ) pareil, et dans ma colonne C les infos qui m'interessent.

actuellement ma macro fonctionne comme ceci: elle me cherche la 1ere ligne qui contient Pompe dans la colonne designation et me récupere la valeur associé dans la colonne C:

Code :
Application.WorksheetFunction.VLookup("*POMPE*", Worksheets(variable1).Range("D2: G65536"), 4, False) * 1000
sauf que je voudrai pouvoir rajouter la contrainte d'une autre vlookup ou par un autre moyen, qu'elle me trouve la ligne qui dans parents contient "habille" et que dans la colonne designation contienne "pompe" et recupere la valeur dans la colonne C associé.


Cela est-il possible via 1 vlookup ? ou 2, ou bien avec une autre fonction?

Merci de votre aide
kyros21 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2011, 10h16   #2
Expert Confirmé Sénior
 
Homme Daniel
aucune
Inscription : septembre 2011
Messages : 2 004
Détails du profil
Informations personnelles :
Nom : Homme Daniel
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : aucune

Informations forums :
Inscription : septembre 2011
Messages : 2 004
Points : 4 037
Points : 4 037
Bonjour,


Code :
1
2
Résultat = _
Evaluate("INDEX(C1:C65536,MAX(IF(NOT(ISERR(SEARCH(""habille"",A2:A65536)))*NOT(ISERR(SEARCH(""pompe"",B2:B65536)))>0,ROW(A2:A65536))))")
__________________
Cordialement.

Daniel

Citation:
La plus perdue de toutes les journées est celle où l'on n'a pas ri.
Chamfort
Daniel.C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2011, 10h31   #3
Invité régulier
 
Homme
Inscription : novembre 2011
Messages : 85
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : novembre 2011
Messages : 85
Points : 5
Points : 5
merci pour cette formule, j'aimerai la comprendre, ne fait evaluate retourne quoi comme résultat? si je souhaite spécifier une feuille spécifique, comment je peux spécifier cela ? en passant par une range et une worksheet? comme ceci ?

Code :
Evaluate("INDEX(Worksheets("Top20 répartition h MO").Range(C1:C65536),MAX(IF(NOT(ISERR(SEARCH(""habille"",A2:A65536)))*NOT(ISERR(SEARCH(""pompe"",B2:B65536)))>0,ROW(A2:A65536))))")
merci de votre aide
kyros21 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2011, 10h48   #4
Expert Confirmé Sénior
 
Homme Daniel
aucune
Inscription : septembre 2011
Messages : 2 004
Détails du profil
Informations personnelles :
Nom : Homme Daniel
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : aucune

Informations forums :
Inscription : septembre 2011
Messages : 2 004
Points : 4 037
Points : 4 037
"Evaluate", comme son nom le laisse penser, évalue une formule Excel (dans sa traduction US) et retourne le résultat dans la variable spécifiée (ici "Résultat"). Pour info, la formule française est :

Code :
=INDEX($C$1:$C$10;MAX(SI(NON(ESTERR(CHERCHE("habille";$A$2:$A$10)))*NON(ESTERR(CHERCHE("pompe";$B$2:$B$10)))>0;LIGNE($A$2:$A$10))))
(formule matricielle, à valider avec Ctrl+Maj+Entrée).
Comme il s'agît d'une formule Excel, libre à toi d'ajouter le nom des feuilles.=avec la même syntaxe que pour une formule. Si tu veux qu'une plage se réfère à une feuille, tu dois écrire :

Code :
INDEX("'Top20 répartition h MO'"!C1:C65536
et non :

Code :
INDEX(Worksheets("Top20 répartition h MO").Range(C1:C65536)
Tu dois qualifier chaque plage de cellules comme tu le ferais dans une formule Excel (en n'oubliant pas les apostrophes qui encadrent les noms de feuille contenant des espaces).

Si tu veux que je te détaille la formule Excel, n'hésite pas à le dire.
__________________
Cordialement.

Daniel

Citation:
La plus perdue de toutes les journées est celle où l'on n'a pas ri.
Chamfort
Daniel.C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2011, 11h24   #5
Invité régulier
 
Homme
Inscription : novembre 2011
Messages : 85
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : novembre 2011
Messages : 85
Points : 5
Points : 5
merci pour ces explications, je pense avoir compris le fonctionnement de la commande, mais pour autant, j'ai toujours une erreur d'incompatibilité de type..

voici la formule adapté, ( la feuille a top 20... a été remplacé par la variable1, qui contient le placement de la feuille dans le classeur , ex: la feuille placé en 8eme renvoi le numero 8 dans la variable1.

Code :
coutpompe=Evaluate("INDEX(variable1!J2:J65536,MAX(IF(NOT(ISERR(SEARCH(""habille"",variable1!B2:B65536)))*NOT(ISERR(SEARCH(""pompe"",variable1!D2:D65536)))>0,ROW(variable1!B2:B65536))))")
kyros21 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2011, 11h39   #6
Expert Confirmé Sénior
 
Homme Daniel
aucune
Inscription : septembre 2011
Messages : 2 004
Détails du profil
Informations personnelles :
Nom : Homme Daniel
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : aucune

Informations forums :
Inscription : septembre 2011
Messages : 2 004
Points : 4 037
Points : 4 037
Tu ne peux pas mettre de variable entre guillemets, sinon le nom de la variable est pris pour le nom de la feuille; il faut mettre :

Code :
1
2
3
coutpompe = Evaluate("INDEX(" & variable1 & "!J2:J65536,MAX(IF(NOT(ISERR(SEARCH(""habille""," & _
    variable1 & "!B2:B65536)))*NOT(ISERR(SEARCH(""pompe""," & variable1 & "!D2:D65536)))>0,ROW(" & _
    variable1 & "!B2:B65536))))")
__________________
Cordialement.

Daniel

Citation:
La plus perdue de toutes les journées est celle où l'on n'a pas ri.
Chamfort
Daniel.C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2011, 10h10   #7
Invité régulier
 
Homme
Inscription : novembre 2011
Messages : 85
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : novembre 2011
Messages : 85
Points : 5
Points : 5
effectivement, je pensais qu'enlever les guillemets suffirait, mais il faut mettre les " & & "....

Code :
coutpompe = Evaluate("INDEX(" & variable1 & "!J1:J65536,MAX(IF(NOT(ISERR(SEARCH(""habille""," & variable1 & "!B2:B65536)))*NOT(ISERR(SEARCH(""pompe""," & variable1 & "!D2:D65536)))>0,ROW(" & variable1 & "!B2:B65536))))")
j'ai toujours une erreur d'incompatibilité de type :S
je ne comprend pas , c'est une formule executer en vba, il ne faut pas mettre Application.WorksheetFunction devant ? j'ai testé et cela me renvoi une erreur : propriété ou methode non géré par cet objet ....

merci de m'aider, je rame la ...

en fait, pourriez vous me detaillé les actions de cette commande, histoire de bien comprendre, et pas d'appliquer betement

merci beaucoup

bonjour, je n'arrive tjr pas à résoudre mon pb d'incompatibilité, auriez vous une solution merci

Cordialement
kyros21 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2011, 10h36   #8
Expert Confirmé Sénior
 
Homme Daniel
aucune
Inscription : septembre 2011
Messages : 2 004
Détails du profil
Informations personnelles :
Nom : Homme Daniel
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : aucune

Informations forums :
Inscription : septembre 2011
Messages : 2 004
Points : 4 037
Points : 4 037
Bonjour,

Regarde le classeur en pièce jointe.
Fichiers attachés
Type de fichier : xls kyros21.xls (36,5 Ko, 2 affichages)
__________________
Cordialement.

Daniel

Citation:
La plus perdue de toutes les journées est celle où l'on n'a pas ri.
Chamfort
Daniel.C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2011, 14h24   #9
Invité régulier
 
Homme
Inscription : novembre 2011
Messages : 85
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : novembre 2011
Messages : 85
Points : 5
Points : 5
merci de votre aide, votre macro marche parfaitement sur votre fichier mais pas sur le mien ... elle ne me donne pas d'erreur ni ne me plante la macro, mais elle m'affiche #REF!, pas moyen de la faire marcher.... la seule chose qui differe de votre tableau, c'est que moi les case contiennent parfois:
ex:
dff586 HABILLE djgid la meme chose avec pompe mais bon ... je vois pas ce que sa change...

a quoi correspond le row à la fin ? quel est cet argument?
Code :
 coutpompe = Evaluate("INDEX(" & variable1 & "!J1:J65536,MAX(IF(NOT(ISERR(SEARCH(""HABILLE""," & variable1 & "!B2:B65536)))*NOT(ISERR(SEARCH(""POMPE""," & variable1 & "!D2:D65536)))>0,ROW(" & variable1 & "!B2:B65536))))")
merci encore de votre aide
kyros21 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2011, 22h37   #10
Expert Confirmé Sénior
 
Homme Daniel
aucune
Inscription : septembre 2011
Messages : 2 004
Détails du profil
Informations personnelles :
Nom : Homme Daniel
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : aucune

Informations forums :
Inscription : septembre 2011
Messages : 2 004
Points : 4 037
Points : 4 037
Peux-tu mettre un petit classeur de test en pièce jointe ?
__________________
Cordialement.

Daniel

Citation:
La plus perdue de toutes les journées est celle où l'on n'a pas ri.
Chamfort
Daniel.C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2011, 09h51   #11
Invité régulier
 
Homme
Inscription : novembre 2011
Messages : 85
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : novembre 2011
Messages : 85
Points : 5
Points : 5
je crois avoir compris,
en réalité ma variable1, ne renvoi pas une valeur comme vous du style feuill1, elle renvoie uniquement 1, 2 ,3 ,4 , du coup il ne trouve pas la bonne page, et ne trouve pas les données..

Code :
'coutpompe = Evaluate("INDEX(" & variable1 & "!J1:J65536,MAX(IF(NOT(ISERR(SEARCH(""HABILLE""," & variable1 & "!B2:B65536)))*NOT(ISERR(SEARCH(""POMPE""," & variable1 & "!D2:D65536)))>0,ROW(" & variable1 & "!B2:B65536))))")
sa serait plutot quelque chose comme sa non ?
Code :
    coutpompe = Evaluate("INDEX( " & Worksheets(variable1).Range("J1:J65536").Address & ",MAX(IF(NOT(ISERR(SEARCH(""HABILLE""," & Worksheets(variable1).Range("B2:B65536").Address & "))*NOT(ISERR(SEARCH(""POMPE""," & Worksheets(variable1).Range("D2:D65536").Address & "))>0,ROW(" & Worksheets(variable1).Range("B2:B65536").Address & ")))")
kyros21 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2011, 10h28   #12
Expert Confirmé Sénior
 
Homme Daniel
aucune
Inscription : septembre 2011
Messages : 2 004
Détails du profil
Informations personnelles :
Nom : Homme Daniel
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : aucune

Informations forums :
Inscription : septembre 2011
Messages : 2 004
Points : 4 037
Points : 4 037
Bien sûr, ça dépend en effet du contenu de la variable.
__________________
Cordialement.

Daniel

Citation:
La plus perdue de toutes les journées est celle où l'on n'a pas ri.
Chamfort
Daniel.C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2011, 11h50   #13
Invité régulier
 
Homme
Inscription : novembre 2011
Messages : 85
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : novembre 2011
Messages : 85
Points : 5
Points : 5
à la suite de la range , on ne met pas .address si ? c'est pour une cellule , pas une range, j'ai une erreur incompatibilité de type actuellement...

Merci encore
kyros21 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2011, 12h26   #14
Expert Confirmé Sénior
 
Homme Daniel
aucune
Inscription : septembre 2011
Messages : 2 004
Détails du profil
Informations personnelles :
Nom : Homme Daniel
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : aucune

Informations forums :
Inscription : septembre 2011
Messages : 2 004
Points : 4 037
Points : 4 037
Je n'ai pas vérifié ta ligne, j'ai pensé que cela fonctionnait... Si variable représente le numéro de la feuille, il faut mettre :

Code :
variable1 = "Feuil" & variable1
et reprendre ma ligne. Si variable1 représente le numéro d'index de la feuille, c'est à dire :

désignation de la premmière feuille :

Il faut modifier le code. Dis-moi ce que représente "variable1".
__________________
Cordialement.

Daniel

Citation:
La plus perdue de toutes les journées est celle où l'on n'a pas ri.
Chamfort
Daniel.C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2011, 13h09   #15
Invité régulier
 
Homme
Inscription : novembre 2011
Messages : 85
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : novembre 2011
Messages : 85
Points : 5
Points : 5
Effectivement, variable 1 represente l'index de la feuille,

car j'ai 3 feuilles fixes en début, et 1 feuille fixe en fin, et je veux traiter les feuilles qui sont entre, cad de la feuille 4 à la feuille x, et ces index sont contenus dans la variable : variable 1 qui renvoi en mini 4 et en maxi x qui varie.

donc oui c'est bien l'index de feuille et non pas son numero : feuilx,



merci
kyros21 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2011, 13h49   #16
Expert Confirmé Sénior
 
Homme Daniel
aucune
Inscription : septembre 2011
Messages : 2 004
Détails du profil
Informations personnelles :
Nom : Homme Daniel
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : aucune

Informations forums :
Inscription : septembre 2011
Messages : 2 004
Points : 4 037
Points : 4 037
Donc :

Code :
1
2
3
4
coutpompe = Evaluate("INDEX(" & Sheets(variable1).Name & _
"!J1:J65536,MAX(IF(NOT(ISERR(SEARCH(""habille""," & _
Sheets(variable1).Name & "!B2:B65536)))*NOT(ISERR(SEARCH(""pompe""," & _
Sheets(variable1).Name & "!D2:D65536)))>0,ROW(" & variable1 & "!B2:B65536))))")
__________________
Cordialement.

Daniel

Citation:
La plus perdue de toutes les journées est celle où l'on n'a pas ri.
Chamfort
Daniel.C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2011, 15h57   #17
Invité régulier
 
Homme
Inscription : novembre 2011
Messages : 85
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : novembre 2011
Messages : 85
Points : 5
Points : 5
Un grand merci, j'ai encore du mal a savoir ecrire correctement du vba, sa fonctionne a merveille merci encore
kyros21 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h05.


 
 
 
 
Partenaires

Hébergement Web