Index-Equiv en VBA
Bonjour à toutes et à tous,
J'ai 2 feuilles nommées respectivement "Feuil1" et "Feuil2".
Dans la feuil1 se trouve ceci :
Dans la feuil2 se trouve ceci :
Processus :
- Dans la feuil2, il y a une colonne nommée "TYPE". Je viens regarder ce qu'il y a dedans.
- Je retourne dans la feuil1, et je viens comparer pour récupérer le temps en heures.
- Puis je copie/colle la valeur du temps dans la feuil2 dans la colonne "TEMPS H".
Exemple :
- Je vais dans la feuil2, à la ligne 3 dans la colonne "TYPE", il y a inscris "TRIM".
- Je retourne dans la feuil1, je regarde pour la ligne correspondante (soit la ligne 8), l'heure correspondante à "TRIM". Ici c'est 6.
- Je la copie/colle dans la feuil2 dans la colonne "TEMPS H".
Objectif :
Ma requête est simple, j'aimerais que vous m'aidiez à réaliser le VBA en appuyant sur un bouton qui permettrais de faire une sorte d'INDEX-EQUIV de ce que je vous ai expliqué juste au dessus.
REMARQUE IMPORTANTE :
Vous pourriez vous dire que ce que je demande est inutile et qu'on peut le réaliser sans VBA. Evidemment, ce POST n'est qu'un exemple et une petite partie de ce que je veux vraiment. J'ai essayer de le simplifier au maximum pour votre compréhension.
En vous remerciant par avance,
@+
Bonsoir MPETIT, le forum,
Un essai....
Sub cherche()
Dim col As Long, lig As Long
Dim i As Long, dl As Long
Application.ScreenUpdating = False
With Sheets("Feuil1")
derlig = .Range("M" & Rows.Count).End(xlUp).Row
End With
With Sheets("Feuil2")
dl = .Range("G" & Rows.Count).End(xlUp).Row
For i = 3 To dl
col = Sheets("Feuil1").Range("H7:L7").Find(.Range("G" & i)).Column
lig = Sheets("Feuil1").Range("M8:M" & derlig).Find(.Range("G" & i)).Row
.Range("E" & i) = Sheets("Feuil1").Cells(lig, col)
Next i
End With
End Sub
CTRL + e pour exécuter la macro
Cordialement,
Bonjour MPETIT, Salut xorsankukai
Au cas où quand même pour le INDEX EQUIV, il est bien possible de l'utiliser dans le code à l'instar de presque toutes les fonctions excel normales. Posons vos ligne et colonne de recherche (de la feuille 1) en H7:L7 et en M8:M12 et le tableau de valeurs en H8:L12.
Sub indexequiv()
dim vrenvoi, vcherchee
dim wf as worksheetfunction 'pas necessaire, juste pour gain de place ici
set wf = worksheetfunction 'idem
vcherchee = sheets("feuil2").range("G3").value
with sheets("feuil1")
vrenvoi = wf.index(.range("H8:L12"), wf.match(vcherchee, .range("M8:M12"), 0), wf.match(vcherchee, .range("H7:L7"), 0))
end with
sheets("feuil2").range("E3").value = vrenvoi
end sub
Les fonctions sont donc les mêmes mais il faut juste appliquer la syntaxe des versions anglaises (noms anglais, virgules) et faire précéder le nom de la fonction de worksheetfunction. ou application. L'avantage en déclarant l'objet worksheetfunction, c'est qu'on a la liste des fonctions et qu'on est guidé lors de la saisie du code.
Par ailleurs, ici, vous savez que la valeur cherchée existe mais parfois, on en est pas sûr. Alors, en général, j'utilise la fonction NB.SI (worksheetfunction.countif) pour contrôler d'abord l'existence et me prémunir d'un bug.
Cdlt,
Bonjour à vous deux, le forum,
Merci pour vos réponses !
C'est presque parfait. Néanmoins il subsiste un problème. Dans mon exemple j'ai mis dans la colonne "TYPE" trois critères :
-TRIM
-SEM
-MEN+B
Jusque là xorsankusai, ton code fonctionne parfaitement, mais dès que je rajoute une ligne (photo ci-dessous) avec un type déjà existant, il ne me prend pas la bonne heure :
Ici, j'ai rajouté une ligne avec son type qui est de MEN+B. Evidemment la durée qui lui est associé n'est pas la même que la ligne juste au dessus.
Donc normalement je devrais avoir cela dans ma feuil2 :
Mais j'obtiens ceci :
Donc si il existe un doublon dans les types il prend la première durée trouvée.
Aurais-tu une idée pour corriger cela ?
PS : 3GB, merci pour la fonction et les explications. La prochaine fois, quand j'essayerais de "transformer" une formule en VBA je penserais à utiliser "worksheetfunction" pour me guider
Bien cordialement,
Bonjour,
Je viens de regarder le fichier. Vous ne voulez pas essayer avec une formule plutôt ? Si jamais, en E3 de la feuil2 :
=SIERREUR(INDEX(Feuil1!$H$8:$L$100;PETITE.VALEUR(SI(Feuil1!$M$8:$M$100=G3;LIGNE(Feuil1!$M$8:$M$100)-7);NB.SI($G$3:G3;G3));EQUIV(G3;Feuil1!$H$7:$L$7;0));"")
à valider avec ctrl + shift + entrée, puis à propager.
Cdlt,
Re,
Malheureusement, sur ce fichier exemple ca fonctionne parfaitement mais pas sur mon "vrai" fichier.
C'est pour cela que je suis obligé de le faire en VBA.
Bien cordialement,
Bonjour MPETIT, le forum,
Salut 3GB,
Un début de réflexion......
Cordialement,