Réalisation de la fonction INDEX - EQUIV double critères en VBA

Bonjour,

Je fais une nouvelle fois appelle à la communauté. Je cherche a réaliser la recherche d'une valeur dans un tableau avec deux critères de ligne. J'arrive pour le moment à le faire avec un seul critère (cf: le code en dessous), cependant je suis à court d'idée pour une recherche à double critère.

Je souhaite réaliser la même fonction INDEX - EQUIV sous forme d'équation mais ici en VBA.

Sub TEST3()

 Dim MaValeur As Variant
    Dim MaPlage As Range
    Dim MaColonne As Single
    Dim ValeurProche As Boolean

    MaValeur = ThisWorkbook.Sheets("Suivi_conso_UO_par_mois").Range("H5")
    Set MaPlage = ThisWorkbook.Sheets("Nb_heure_presta").Range("C:E")
    MaColonne = 3
    ValeurProche = False

    MsgBox RECHERCHEV(MaValeur, MaPlage, MaColonne, ValeurProche)

End Sub

Function RECHERCHEV(Valeur_Cherchee As Variant, Table_matrice As Range, Colonne_a_retourner As Variant, Optional Valeur_proche As Boolean)

On Error GoTo RECHERCHEVerror

    If IsNumeric(Colonne_a_retourner) = True Then
        RECHERCHEV = Application.VLookup(Valeur_Cherchee, Table_matrice, Colonne_a_retourner, Valeur_proche)
    Else
        Dim ColonneDebut As Single
        Dim ColonneRecherchee As Single

        ColonneDebut = Table_matrice.Cells(1).Column
        ColonneRecherchee = Range(Colonne_a_retourner & "1").Column
        Colonne_Index = ColonneRecherchee - ColonneDebut + 1
    End If

If IsError(RECHERCHEV) Then RECHERCHEV = "#N/A"

Exit Function
RECHERCHEVerror:
    RECHERCHEV = "#N/A"
End Function

Je vous remercie par avance.

Bonjour

SI je comprends vous cherchez la valeur de H5 en colonne E de votre variable "Maplage". Si oui, pourquoi ne pas faire plus simple

Sub TEST3()
Dim MaValeur As Variant
Dim MaPlage As Range
Dim lig As Integer

MaValeur = ThisWorkbook.Sheets("Suivi_conso_UO_par_mois").Range("H5").Value2
Set MaPlage = ThisWorkbook.Sheets("Nb_heure_presta").Range("E:E")
On Error Resume Next
lig = WorksheetFunction.Match(MaValeur, MaPlage, 0)
If lig > 0 Then
    MsgBox CDate(Range("E" & lig))
Else: MsgBox "Valeur non trouvée"
End If
End Sub

si ok, pensez à

Crdlt

Vous avez raison qu'il y a plus simple. Cependant ce n'est pas mon problème. Mon problème est de ressortir cette valeur non pas avec un seul critère de ligne, mais avec deux critères.

Il faut donc que ma fonction prenne en compte deux valeurs d'entrée, qu'elle aille chercher ces deux valeurs dans un tableau avec mon critère 1 sur ma colonne 1 et mon critère 2 sur ma colonne 2, pour ensuite aller chercher la valeur correspondante sur mon colonne 3 et me l'a renvoyer.

J'espère m'être compris, en tout cas merci pour votre réponse.

Ok mais ce n'est pas tout à fait ce que je lis dans le code que vous avez placé
La 1ere valeur H5 concerne des heures je crois et se trouve dans quelle colonne ? la 1 ? Sinon où trouve-t-on la valeur du critère 1 et du critère 2

Autre question : Est-ce que la colonne 1 qui doit contenir le critère 1 peut avoir des doublons ou pas ?

Pouvez-vous mettre un fichier exemple ce sera plus facile d'adapter à votre situation.

Je vous joins un fichier exemple. (je n'est pas remet

Le critère 1 se trouve dans la colonne A de ma feuille "Conso_UO_par_mois", le critère 2 dans la colonne B de cette même feuille.

En effet le critère 1 peut avoir des doublons c'est pour cela qu'il y a le critère 2 qui permet de préciser en quelque sorte la valeur.

(Je me rends compte que la macro ne fonctionne plus avec mon fichier exemple)

Merci de votre fichier

Donc là dans la feuille "Conso_UO_par_mois" on doit trouve 10 en C3 et 5 en C5. Juste ?


(Je me rends compte que la macro ne fonctionne plus avec mon fichier exemple)

Bah oui, dans votre code on fait référence à la cellule H5 et à la colonne E ou au range(C:E). Ce n'est plus la même chose.

C'est exacte

Bonjour

Essayez avec ce code

Sub TEST3()
Dim MaPlage As Range
Dim lig As Integer
Dim cel As Range, c As Range
Dim Prem As String

With ThisWorkbook
    Set MaPlage = .Sheets("Suivi_conso_UO_par_mois").ListObjects(1).ListColumns(1).Range
    For Each cel In .Sheets("Nb_Heure_Presta").ListObjects(1).ListColumns(1).DataBodyRange
        Set c = MaPlage.Find(cel, LookIn:=xlValues)
        If Not c Is Nothing Then
            Prem = c.Address
            Do
                If UCase(c.Offset(0, 1)) = UCase(cel.Offset(0, 1)) Then
                    c.Offset(0, 2) = cel.Offset(0, 2).Value
                End If
                Set c = MaPlage.FindNext(c)
            Loop While Not c Is Nothing And Prem <> c.Address
        End If
    Next cel
End With
End Sub

Si ok pensez à

Crdlt

Cela fonctionne parfaitement ! Merci pour votre aide

Rechercher des sujets similaires à "realisation fonction index equiv double criteres vba"