XL 2013 Trouver n° ligne en fonction d'une date et du nom d'une équipe

Esfloria

XLDnaute Nouveau
Bonsoir à tou(s)tes,

Malgré toutes mes recherches, je n'arrive pas à trouver de solution au problème suivant (le fichier test ci-joint). J'ai vu des solutions sous VBA mais je préfère les fonctions.

Je m'explique : j'ai un 1er onglet JapanLeague recensant tous les matchs.

Dans l'onglet Match2Equipes, j'ai trouvé 19 matchs concernant les équipes Kawasaki Frontale & Urawa Reds. J'ai affiché les dates de chaque match et à côté de chaque date, j'aimerai faire apparaitre le n° de ligne. Par exemple le 21/03/2021, il y a 7 matchs. Celui qui m'intéresse se trouve ligne 2822.

J'ai beau essayé mais je n'arrive pas à trouver la solution. Je reste avec la moitié d'une solution avec Equiv. Il semble qu'en combinant avec Index, j'aurai la solution mais je n'y arrive pas. Un petit coup de main svp?

D'avance, je vous remercie.

Bien cordialement.
 

Pièces jointes

  • Test_ED.xlsx
    350.5 KB · Affichages: 6

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Esfloria,
Un essai en PJ avec :
VB:
=SIERREUR(SIERREUR(EQUIV(B3&$E$2&$F$2;JapanLeague!$B$1:$B$3100&JapanLeague!$D$1:$D$3100&JapanLeague!$E$1:$E$3100;0);EQUIV(B3&$E$2&$F$2;JapanLeague!$B$1:$B$3100&JapanLeague!$E$1:$E$3100&JapanLeague!$D$1:$D$3100;0));"")
Formule matricielle donc à valider avec MAJ+CTRL+Entrée.
J'ai limité la plage à la ligne 3100 car sur toutes les colonnes ça rame beaucoup.
 

Pièces jointes

  • Test_ED.xlsx
    381.2 KB · Affichages: 5

Esfloria

XLDnaute Nouveau
Bonjour Esfloria,
Un essai en PJ avec :
VB:
=SIERREUR(SIERREUR(EQUIV(B3&$E$2&$F$2;JapanLeague!$B$1:$B$3100&JapanLeague!$D$1:$D$3100&JapanLeague!$E$1:$E$3100;0);EQUIV(B3&$E$2&$F$2;JapanLeague!$B$1:$B$3100&JapanLeague!$E$1:$E$3100&JapanLeague!$D$1:$D$3100;0));"")
Formule matricielle donc à valider avec MAJ+CTRL+Entrée.
J'ai limité la plage à la ligne 3100 car sur toutes les colonnes ça rame beaucoup.
Bonjour Sylavanu,

Merci pour votre aide. J'ai compris la structure de la fonction. J'étais loin d'imaginer que la solution était avec avec "&". Pour info, quelle aurait été la solution sous VBA?

En vous renouvelant mes remerciements,

Bien cordialement.
 

patricktoulon

XLDnaute Barbatruc
re
bonjour a tous
moi aussi j'ignorais que le concat etait possible
@sylvanu 👍

je soupconne que ta formule prend en charge l'inversion des 2 colonnes pour les equipes
c'est ça ?
perso j'ai toujours connu cette formule (qui etonnament ne fonctionne pas sur ce fichier
VB:
equiv(1;(JapanLeague!b1:b3100=b4)*(JapanLeague!D1:D3100=E2)*(JapanLeague!e1:e3100=f2))
'ou invers des colonne equipe
equiv(1;(JapanLeague!b1:b3100=b4)*(JapanLeague!D1:D3100=f2)*(JapanLeague!e1:e3100=e2))
 
Dernière édition:

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bien le bonjour,
@patrick, Oui car on peut avoir Eq1 vs Eq2 OU Eq2 vs Eq1. D'ailleurs, je pense que le premier Sierreur est inutile.
@Esfloria,
Je pense que quelques lignes de VBA sont plus souples que des formules alambiquées ... pour ceux qui aiment le VBA.
Un ex en PJ. La mise à jour est automatique, il suffit de choisir ses équipes dans les listes déroulantes en E2 et F2. Avec :
VB:
Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count > 1 Then Exit Sub
    If Not Intersect(Target, Range("E2:F2")) Is Nothing Then
        TrouveMatchs
    End If
End Sub
Sub TrouveMatchs()
    Dim Ligne%, i%, Eq1$, Eq2$, tablo
    Range("A3:L100").ClearContents
    Ligne = 3
    Application.ScreenUpdating = False
    With Sheets("JapanLeague")
        DL = .Range("A65500").End(xlUp).Row
        tablo = .Range("A2:E" & DL)
    End With
    Eq1 = [Equipe1]: Eq2 = [Equipe2]
    For i = 1 To UBound(tablo)
        If tablo(i, 4) = Eq1 Or tablo(i, 5) = Eq1 Then
            If tablo(i, 4) = Eq2 Or tablo(i, 5) = Eq2 Then
                Cells(Ligne, "A") = tablo(i, 1)
                Cells(Ligne, "B") = tablo(i, 2)
                Cells(Ligne, "C") = Month(tablo(i, 2))
                Cells(Ligne, "D") = i + 1
                Ligne = Ligne + 1
            End If
        End If
    Next i
    Application.ScreenUpdating = True
End Sub
 

Pièces jointes

  • Test_ED.xlsm
    388.3 KB · Affichages: 4

Esfloria

XLDnaute Nouveau
re
bonjour a tous
moi aussi j'ignorais que le concat etait possible
@sylvanu 👍

je soupconne que ta formule prend en charge l'inversion des 2 colonnes pour les equipes
c'est ça ?
perso j'ai toujours connu cette formule (qui etonnament ne fonctionne pas sur ce fichier
VB:
equiv(1;(JapanLeague!b1:b3100=b4)*(JapanLeague!D1:D3100=E2)*(JapanLeague!e1:e3100=f2))
'ou invers des colonne equipe
equiv(1;(JapanLeague!b1:b3100=b4)*(JapanLeague!D1:D3100=f2)*(JapanLeague!e1:e3100=e2))
Bonjour Patrick,

Merci pour ton aide. En effet, la date objet de la recherche de ligne, est une fonction grande.valeur assortie d'une condition OU (équipe1 ou équipe 2).
Bien le bonjour,
@patrick, Oui car on peut avoir Eq1 vs Eq2 OU Eq2 vs Eq1. D'ailleurs, je pense que le premier Sierreur est inutile.
@Esfloria,
Je pense que quelques lignes de VBA sont plus souples que des formules alambiquées ... pour ceux qui aiment le VBA.
Un ex en PJ. La mise à jour est automatique, il suffit de choisir ses équipes dans les listes déroulantes en E2 et F2. Avec :
VB:
Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count > 1 Then Exit Sub
    If Not Intersect(Target, Range("E2:F2")) Is Nothing Then
        TrouveMatchs
    End If
End Sub
Sub TrouveMatchs()
    Dim Ligne%, i%, Eq1$, Eq2$, tablo
    Range("A3:L100").ClearContents
    Ligne = 3
    Application.ScreenUpdating = False
    With Sheets("JapanLeague")
        DL = .Range("A65500").End(xlUp).Row
        tablo = .Range("A2:E" & DL)
    End With
    Eq1 = [Equipe1]: Eq2 = [Equipe2]
    For i = 1 To UBound(tablo)
        If tablo(i, 4) = Eq1 Or tablo(i, 5) = Eq1 Then
            If tablo(i, 4) = Eq2 Or tablo(i, 5) = Eq2 Then
                Cells(Ligne, "A") = tablo(i, 1)
                Cells(Ligne, "B") = tablo(i, 2)
                Cells(Ligne, "C") = Month(tablo(i, 2))
                Cells(Ligne, "D") = i + 1
                Ligne = Ligne + 1
            End If
        End If
    Next i
    Application.ScreenUpdating = True
End Sub
Merci Sylvanu. Je trouve là une excellente occasion et motivation pour me mettre au VBA.

Vraiment, sur excel downloads on trouve assurément de l'aide mais surtout beaucoup de bienveillance. Mille mercis à vous tous derrière vos claviers.

En vous souhaitant à tous une belle journée.

Bien cordialement.
 

Esfloria

XLDnaute Nouveau
Bonsoir le forum et particulièrement Sylvanu (si tu es en ligne).

Je fais suite à nos échanges ci-dessus.

J’ai commencé à me former au VBA. J’en suis au tout, tout début. Toutefois, afin de conserver la motivation, j’essaie de comprendre et d’adapter le fichier VBA que m’a fourni ce dernier.

Ces modifications sont faites en toute humilité et dans le seul but de comprendre l’information fournie par le forum. N’y voyez svp aucune prétention. On y va.

1/ Dans le fichier d’origine, il y avait en feuille Match2Equipes, colonne C des informations « mois » que j’ai supprimé et remplacé par « Heure ». Par conséquent, j’ai corrigé la ligne Cells(Ligne, "C") = Month(tablo(i, 2)) comme suit : Cells(Ligne, "C") = tablo(i, 3).

2/ En adaptant le code fourni par Sylvanu, j’ai essayé de créer une feuille Domicile comme suit en VBA… qui donne de faux résultats…

Sub Worksheet_Change(ByVal Target As Range)

If Target.Count > 1 Then Exit Sub

If Not Intersect(Target, Range("E1")) Is Nothing Then

TrouveMatchs

End If

End Sub

Sub TrouveMatchs()

Dim Ligne%, i%, Eq1$, tablo

Range("A3:H999").ClearContents

Ligne = 3

Application.ScreenUpdating = False

With Sheets("JapanLeague")

DL = .Range("A65500").End(xlUp).Row

tablo = .Range("A2:H" & DL)

End With

Eq1 = [Equipe1]

For i = 1 To UBound(tablo)

If tablo(i, 4) = Eq1 Then

Cells(Ligne, "A") = tablo(i, 1)

Cells(Ligne, "B") = tablo(i, 2)

Cells(Ligne, "C") = tablo(i, 3)

Cells(Ligne, "D") = i + 1

Cells(Ligne, "E") = tablo(i, 5)

Cells(Ligne, "F") = tablo(i, 6)

Cells(Ligne, "G") = tablo(i, 7)

Cells(Ligne, "H") = tablo(i, 8)

Ligne = Ligne + 1

End If

Next i

Application.ScreenUpdating = True

End Sub

Et une autre feuille « Extérieur » (qui semble bien fonctionner) comme suit :

Sub Worksheet_Change(ByVal Target As Range)

If Target.Count > 1 Then Exit Sub

If Not Intersect(Target, Range("E1")) Is Nothing Then

TrouveMatchs

End If

End Sub

Sub TrouveMatchs()

Dim Ligne%, i%, Eq1$, tablo

Range("A3:H999").ClearContents

Ligne = 3

Application.ScreenUpdating = False

With Sheets("JapanLeague")

DL = .Range("A65500").End(xlUp).Row

tablo = .Range("A2:H" & DL)

End With

Eq1 = [Equipe1]

For i = 1 To UBound(tablo)

If tablo(i, 5) = Eq1 Then

Cells(Ligne, "A") = tablo(i, 1)

Cells(Ligne, "B") = tablo(i, 2)

Cells(Ligne, "C") = tablo(i, 3)

Cells(Ligne, "D") = i + 1

Cells(Ligne, "E") = tablo(i, 4)

Cells(Ligne, "F") = tablo(i, 6)

Cells(Ligne, "G") = tablo(i, 7)

Cells(Ligne, "H") = tablo(i, 8)

Ligne = Ligne + 1

End If

Next i

Application.ScreenUpdating = True

End Sub

Fichier joint.


Au moment où je poste, il est 23h16. Ceci explique peut-être cela. Mais j’ai l’impression que des déclarations ont été omises par méconnaissance ??

D’avance, je vous remercie tous pour votre aide.

E.
 

Pièces jointes

  • Test_ED-VBA.xlsm
    410.7 KB · Affichages: 1

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonsoir Esfloria,
Un essai en PJ.
Je pense que le problème est la réentrance. Comme chaque modif dans la feuille appelle la fonction Worksheet_Change, et que cette fonction modifie en permanence des cellules de cette même feuille, à chaque fois elle est rappelée.
On peut bloquer ces appels avec Application.EnableEvents = False , et les ré autoriser avec True.
VB:
Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count > 1 Then Exit Sub
    If Not Intersect(Target, Range("E1")) Is Nothing Then
    Application.EnableEvents = False    ' Bloque toute réentrance
        TrouveMatchsDomicile
    End If
Fin:
    Application.ScreenUpdating = True
    Application.EnableEvents = True     ' Réautorise évents
End Sub
Qui plus est, vous aviez Eq1 = [Equipe1], or dans Domicile, cela doit être Eq1 = [E1]
A tester, dites moi si c'est ok.

NB: Mon fiston se demandait à quoi pouvait bien servir votre fichier ?
Il trouve que ça ressemble beaucoup à ce site : https://www.flashscore.fr/equipe/urawa/C8IHSxPk/resultats/
:)
 

Pièces jointes

  • Test_ED-VBA.xlsm
    447.6 KB · Affichages: 3

Esfloria

XLDnaute Nouveau
Bonsoir Esfloria,
Un essai en PJ.
Je pense que le problème est la réentrance. Comme chaque modif dans la feuille appelle la fonction Worksheet_Change, et que cette fonction modifie en permanence des cellules de cette même feuille, à chaque fois elle est rappelée.
On peut bloquer ces appels avec Application.EnableEvents = False , et les ré autoriser avec True.
VB:
Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count > 1 Then Exit Sub
    If Not Intersect(Target, Range("E1")) Is Nothing Then
    Application.EnableEvents = False    ' Bloque toute réentrance
        TrouveMatchsDomicile
    End If
Fin:
    Application.ScreenUpdating = True
    Application.EnableEvents = True     ' Réautorise évents
End Sub
Qui plus est, vous aviez Eq1 = [Equipe1], or dans Domicile, cela doit être Eq1 = [E1]
A tester, dites moi si c'est ok.

NB: Mon fiston se demandait à quoi pouvait bien servir votre fichier ?
Il trouve que ça ressemble beaucoup à ce site : https://www.flashscore.fr/equipe/urawa/C8IHSxPk/resultats/
:)
Bonjour Sylvanu,

Après un rapide test tout semble OK. J'aide (autant que faire se peut) mon père qui s'intéresse aux paris sportifs.

Encore un grand merci et belle journée.

Bien cordialement.

E.
 

Discussions similaires

Statistiques des forums

Discussions
311 725
Messages
2 081 940
Membres
101 845
dernier inscrit
annesof