Index match VBA

Bonjour à toutes et tous,

j'ai dans ma base de donnée excel un tableau comprenant en entête les champs suivants

Id |Acronym | id_Projet | Del_Nr | Del_Name | Del_PI | Del_Start_month | Del_Start_date | Del_End_month | Del_End_date

je dois pouvoir récupérer la date de début (Del_Start_date) d'un projet et dont le (Del_Name) est par exemple "Reporting 1"

dans le fichier excel lui même j'ai réussi via la formule suivante:

=SI(ESTERREUR(INDEX(Tab_Deliverables[Del_Start_date];EQUIV(G2&"Reporting 1";Tab_Deliverables[Acronym]&Tab_Deliverables[Del_Nr];0)));"";INDEX(Tab_Deliverables[Del_Start_date];EQUIV(G2&"Reporting 1";Tab_Deliverables[Acronym]&Tab_Deliverables[Del_Nr];0)))

ceci étant dit j'ai du établir un formulaire pour faciliter la consultation de donnée et à court terme l'ajout et le système d'update d'information et j'ai donc besoin de récupérer désormais les dates de début et de fin au sein du formulaire.

je tente de cette façon mais cela ne fonctionne pas :

'Period1_Start = Application.Index(Sheets("Deliverables").Range("H:H"), Application.Match(Acronym & "Reporting 1", 0, Sheets("Deliverables").Range("B:B") & Sheets("Deliverables").Range("D:D"), 0))

cela correspondant à chercher la date en colonne H correspondant à ligne du projet correspondant au projet en colonne acronyme (la colonne B) et au del_NR = Reporting 1 (colonne D)

je pense que ma syntaxe de formule n'ai pas bonne.

Quelqu'un pourrait il m'aider?

Merci par avance

Bonjour,

Merci de poster ton fichier (données aninymisées)

Bonjour

Pourquoi joindre un fichier :

Sur la charte du Forum

https://forum.excel-pratique.com/annonces/explications-et-regles-a-respecter-t13.html

Point 6 : • Pensez à joindre un fichier pour faciliter la compréhension du problème et augmenter les chances de vous faire aider (taille limite : 1 mo, n'hésitez pas à compresser vos fichiers).

Pour joindre un fichier :

http://www.youtube.com/watch?v=EbNYLzTz5wM

Cordialement

Bonjour,

Effectivement un fichier peut certainement aider mais j'ai du en créer un pour reproduire le soucis

voila le fichier en question:

7test.xlsx (16.78 Ko)

quand on lance le formulaire si on récupère la date directement dans la cellule cela fonctionne mais j'ai besoin de chercher cela en direct dans la base d'ou la deuxième case mais pour laquelle la formule génère une incompatibilité de type

je ne suis même pas sur que ma formule soit correcte de base

Aussi merci de l'aide que vous pourrez m'apporter

quand on lance le formulaire si on récupère la date directement dans la cellule cela fonctionne

ton fichier ne comporte pas de formulaire, pas de macro, c'est un fichier xlsx

mais j'ai besoin de chercher cela en direct dans la base d'ou la deuxième case mais pour laquelle la formule génère une incompatibilité de type

une incompatibilité de type est donnée dans une macro ...

Tout ce que je vois c'est une formule matricielle, que j'aurais tendance à simplifier comme suit :

=INDEX(Tableau1[Del_Start_date];EQUIV(C$2&"-"&$B3;Tableau1[Acronym]&"-"&Tableau1[Del_Nr];0))
4test.xlsx (17.05 Ko)

Bonjour,

Oups, je suis sincèrement désolé mais oui je me suis trompé de version de document.

Voici la version avec macro!

5test.xlsm (25.84 Ko)

merci de l'aide que vous pourrez m'apporter

ps; merci pour la petite correction de formule que je vais de suite aller tester

bonne journée

Ton code n'est pas bien long ! 2 lignes ...

as-tu une idée d là où se trouve l'erreur ?

as-tu supprimé une ligne, puis l'autre pour le savoir ?

as-tu essayé de supprimer un morceau de la ligne pour le savoir -sans chercher à ce stade le résultat ?

Tu découvrirais peut-être 2 ou 3 choses :

  • que Acronym n'est jamais défini !
  • que l'esperluette dans

    n'est pas accepté par VBA
  • que

    requiert que X soit un nombre

Voici une fonction qui permet de déterminer la ligne concernée par :

  • une valeur1 dans une plage
  • et une valeur2 décalée de decalage par rapport à la valeur1
Function ici(plage As Range, valeur1 As Variant, valeur2 As Variant, decalage as Integer) As Range
    With plage
        ok = False
        Set ici = .Find(valeur1, LookIn:=xlValues)
        If Not ici Is Nothing Then
            prem = ici.Address
            Do
                If ici.Offset(0, decalage) = valeur2 Then ok = True
                If Not ok Then Set ici = .FindNext(ici)
            Loop While Not ici Is Nothing And ici.Address <> prem And Not ok
        End If
    End With
End Function

mais la formule ci-dessus sans VBA est largement suffisante !

Merci pour tout cela même si je ne suis pas de bien comprendre

j'ai effectivement et à tort omis de rajouter la ligne lié à l'acronyme pour ce fichier exemple

ici Acronym = Sheets("Feuil1").Range("G2")

je prends bonne note que

Sheets("Deliverables").Range("B:B") & Sheets("Deliverables").Range("D:D") n'est pas accepté par VBA

mais alors comment faire comprendre de là ou chercher le match?

par ailleurs ok pour application index merci à toi

Application.Index(Sheets("Deliverables").Range("H:H"), X)

mais le x en question corresponds aux nombres de ligne?

mon problème ici est effectivement que ma fonction initiale fonctionne sur excel mais j'ai besoin de mettre en place un formulaire d'insertion / update etc.

pour ce faire je dois récupérer les infos dans ma base et dois bien remplacer la fonction par une compatible en vba mais j'avoue ne pas être super doué sur cela

enfin merci pour ce code mais ne vois pas comment il s'applique à mon cas

ok, si VBA est indispensable, je reprends la résolution du sujet

merci par avance

j'ai effectivement et à tort omis de rajouter la ligne lié à l'acronyme pour ce fichier exemple

ici Acronym = Sheets("Feuil1").Range("G2")

Tu es sûr ?

Sheets("Feuil1").Range("G2") ne contient que Poste 1 et tu demandes à chercher dans 2 colonnes différentes !!!!!!!!!!!!!!!!!

Sois plus rigoureux, désolé ... je poursuis quand même.

Euh quand je fais

MsgBox Acronym ca me donne bien Projet 1 indiqué dans la cellule ...

MsgBox Acronym ca me donne bien Projet 1 indiqué dans la cellule ...

Peut-être, mais tu cherches aussi le Reporting 1 ?? puisque tu voulais aussi tester dans la colonne D !

Sheets("Deliverables").Range("B:B") & Sheets("Deliverables").Range("D:D")

Voici pour la recherche en colonnes B et D

Private Sub UserForm_Initialize()

    Period1_Start = Sheets("Feuil1").Range("D6")

    With Sheets("Feuil1")
        projet = .Range("G2")
        report = .Range("D5")
    End With
    With Sheets("Deliverables")
        ok = False
        Set ici = .Range("B:B").Find(projet, LookIn:=xlValues)
        If Not ici Is Nothing Then
            prem = ici.Address
            Do
                If ici.Offset(0, 2) = report Then ok = True
                If Not ok Then Set ici = .Range("B:B").FindNext(ici)
            Loop While Not ici Is Nothing And ici.Address <> prem And Not ok
        End If
        If ok Then
            Period1_Start2 = ici.Offset(0, 6)
        Else
            Period1_Start2 = "pas trouvé"
        End If
    End With

End Sub
2test.xlsm (26.42 Ko)

merci à toi pour ce code en effet beaucoup plus pro et détaillé

toutefois dans mon cas je vais devoir jusqu’à 8 dates de début de reporting et ensuite les dates de fin pour mon formulaire

1test-1.xlsm (25.40 Ko)

dois je ré appliquer ce même code pour chaque champ ou peut il aller chercher toutes les infos en même temps?

et par ailleurs c'est bien d'aller pouvoir les récupérer mais quand il s'agira de pouvoir les mettre a jour comment pourrais je savoir qu'elle cellule updater?

merci par avance

Tu peux avoir toutes les infos en même temps

Dans le code, si ok=True le programme a trouvé la ligne où se trouve le projet (e colonne B) et le reporting (en colonne D)

Alors, Period1_Start2 est ici égale à la cellule d la colonne B décalée de 6 colonnes, tu peux ensuite récupérer n'importe quelle valeur de la ligne en décalant de la valeur correspondante si ces valeurs sont bien sur cette ligne.

Par contre, ,si tu cherches d'autres "reporting" il faudra remouliner le code complètement.

        If ok Then
            Period1_Start2 = ici.Offset(0, 6)
        Else
            Period1_Start2 = "pas trouvé"
        End If

Je suis d'accord avec votre raisonnement et en effet cela me permets de récupérer toutes les données de la ligne:

Period1_End = ici.Offset(0, 8)

me permets de me donner la date de fin du reporting concerné

néanmoins comment procéder pour chaque reporting

report = .Range("D5")

il e me faut de base avoir les infos pour Reporting 1 Reporting 2 et cela jusqu'a 8

Il faut refaire toute la boucle ou presque

Reposte alors un fichier plus complet car je ne suis parti que sur ton fichier intial

Voici

2test-1.xlsm (29.75 Ko)
Private Sub UserForm_Initialize()

For i = 1 To 6
    With Sheets("Deliverables")
        ok = False
        Set ici = .Range("B:B").Find(Sheets("Feuil1").Range("G2").Value, LookIn:=xlValues)
        If Not ici Is Nothing Then
            prem = ici.Address
            Do
                If ici.Offset(0, 2) = ("Reporting " & i) Then ok = True
                If Not ok Then Set ici = .Range("B:B").FindNext(ici)
            Loop While Not ici Is Nothing And ici.Address <> prem And Not ok
        End If
        If ok Then
            debut = ici.Offset(0, 6)
            fin = ici.Offset(0, 8)
        Else
            debut = "pas trouvé"
            fin = "pas trouvé"
        End If
    End With

    Select Case i
        Case 1
            Period1_Start = debut
            Period1_End = fin
        Case 2
            Period2_Start = debut
            Period2_End = fin
        Case 3
            Period3_Start = debut
            Period3_End = fin
        Case 4
            Period4_Start = debut
            Period4_End = fin
        Case 5
            Period5_Start = debut
            Period5_End = fin
        Case 6
            Period6_Start = debut
            Period6_End = fin
    End Select

Next

End Sub
3test-1.xlsm (28.13 Ko)

Merci à vous Steelson !

je pense que ce code me servira aussi pour récupérer les déliverables autres que reporting!

Du reste une dernière question sans vouloir abuser:

Comment dans un formulaire faire afficher et pouvoir modifier un nombres indéfini de résultat?

exemple si je veux lister le nombre de centres impliqués dans un projet ou ici la liste de ! comment les faire afficher dans un formulaire alors que je ne sais pas d'avance le nombre de résultat?

merci par avance

bon weekend

Rechercher des sujets similaires à "index match vba"