Index-Equiv en VBA

Bonjour à toutes et à tous,

J'ai 2 feuilles nommées respectivement "Feuil1" et "Feuil2".

Dans la feuil1 se trouve ceci :

image

Dans la feuil2 se trouve ceci :

image

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,

@+

18exemple.xlsm (15.11 Ko)

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
44exemple-v3.xlsm (21.73 Ko)

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 :

image

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 :

image

Mais j'obtiens ceci :

image

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,

19exemple-v4.xlsm (24.91 Ko)

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......

46exemplev5.xlsm (153.74 Ko)

Cordialement,

Rechercher des sujets similaires à "index equiv vba"