Fonction Like et filter , chaine de caratere

Bonjour a tous ,

Je viens vers se forum, pour d'éventuelles pistes; puisque je bloque sur un petit projet d'étude de musique ( performance hippique)

voila mes départs

soit le code suivant

 Dim strMusik1 as String, ' essai, et test avec Musik1 du cheval
j'associe dans ma recherche 3 tableaux du types : 
Places_Arrivee_Chevaux = Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9" ) 'si caractère "0" cheval non place, donc 11 points
Fautes_Chevaux = Array( "Disqualifie", "Tombe", "Arrete", "Retrograde")'les fautes durant la période 
Discipline_Chevaux = Array( "plat", "monte", "attele", "obstacle", "cross", "haie", "steeple-chase")'les disciplines

Regarde_Disciplines() as String
Regarde_Fautes() as String
Regarde_Places() as String
Regarde_Incident() as String

Application.ScreenUpdating = False
'-------------------------'

strMusik1 ="Da 1a 4a 0a (16) 9a 7m 6m" 'essai avec 1 musique'
Codifier_Musik()=split(strMusik1, " ") '--analyse musique sous forme de tableau'
    for isik =LBound(Codifier_Musik) To UBound(Codifier_Musik) ' boucle sur le tabelau'
        Select Case (Codifier_Musik(isik)) True 'repere les performances et comptabilise'
            Case Is (Codifier_Musik(isik) Like "[0-9][D,T,A,Ret][p,m,a,o,c,h,s]" 

                Regarde_Fautes=Filter(Filter(Filter(Filter(Fautes_Chevaux, "D", True, vbTextCompare), "T", True, vbTextCompare), "A", True, vbTextCompare), "R",True, vbTextCompare)

 est ce que je peux a se niveau  utiliser la fonction filter de cette façon ???

                    For iplac=0 To UBound(Places_Arrivee_Chevaux)
                        For ifaut=0 To UBound(Fautes_Chevaux)
                            For idisip=0 To UBound(Discipline_Chevaux)]" 

pour la suite du code je suis indécis, la recherche se fait dans le strMusik1 que je dois associer aux 3 tableaux ci-dessus

vous voyez ma fonction Like, qui détecte les chaines de caractères bien spécifiques.

par contre je butes sur la fonction filter. est ce que cette écriture est admise ?? qu'elle serait sont équivalent , pour brasser chaque contenu de ma variable strMusik1 , si [D,T,A,Ret]" je dois comptabiliser une variable se 11 points, si "0" présent je dois comptabiliser 11 points..

Je pourrais travailler sur une piste, puisque mon code se répète; là ou tous se fait, c'est avec la fonction Like, et filter

par la suite, je pourrais continuer mon code avec votre piste...

j'espère que j'ai été assez explicite.

merci pour tous vos directives, et exemples..

Hello !

Alors, je pense que si tu veux de l'aide ça serait plus simple de joindre ton fichier directement ^.^

J'ai du mal a saisir le rapport entre les chevaux et la musique ?

bonjour, et merci a zohnya pour se poste.

je te rassure, il n'y a aucun rapport entre la musique, et les chevaux aux sens propre du terme.

ils ont trouvés se terme, pour codifier les différentes arrivées ( "0" non placé, et 1er, 2iem,3iem, ...9iem) évènements comme (Tombé, Distancé,... ect ect)

la musique d'un cheval, est la performance d'un cheval, comme tu peux le voir dans mon poste qui est assez parlant en strMusik1

Ok, alors je mettrais le fichier de mon code merci

Bonjour,

alors je mettrais le fichier de mon code merci

Sans oublier d'illustrer le résultat à obtenir, car cela est pour l'instant assez vague !

Bonjour j'ai mise en pièce jointe

mon fichier de test musique cheval 1 et le début de mon code.

très commenté, pour les résultats a atteindre.

surtout la mise en œuvre multiple pour la fonction LIKE, et Filter

Merci de vos pistes.

Bonjour,

Très insuffisant !

Ce qui serait souhaitable, c'est un échantillon de diverses musiques, illustrant l'éventail des cas susceptibles de se présenter, d'une part, et d'autre part le résultat à obtenir pour chacune de ces musiques.

La méthode pour y parvenir ! Cela regarde chaque intervenant qui propose une solution... Inutile de chercher à lui imposer une méthode, qu'il ne suivra pas en toute logique car si elle t'avait permis d'atteindre ton but tu ne serais pas ici !

Mais en tout état de cause, on réfléchit à partir de l'objectif à atteindre et des éléments de la question dont on dispose, sans préjuger de la méthode à utiliser...

En outre, des questions visant à traiter des musiques de la sorte ont déjà été posées sur le Forum. Je me souviens notamment d'un demandeur qui avec esprit d'à-propos avait fourni une doc. sur la signification de chaque élément de la musique, permettant de la lire... Je n'ai pas retrouvé ça dans mes archives, mais il serait judicieux de disposer d'une telle doc. pour travailler sur cette question.

Bonjour,

Alors je te remercie de m'avoir répondu.

Je suis débutant en VBA, et si je suis venus sur se forum, c'est justement d'avoir des pistes aux traitements des chaines de caractères

comme je tente de le faire.

Effectivement, comme tu dis dans ta réponse, il y à différentes interprétations d'une musique hippique, et plusieurs visions

la façon dont je l'ai exposé, est le plus simplement qu'il soit

justement; le but, est d'être le plus simple possible dans le comptage des points.

(avec les règles hippiques, que je tente de faire, suivant ma rencontre que j'ai eu avec un parieur)

si je te mets une successions de 4 musiques, cela sera la même façon de procéder dans le comptage des points.

avec les explications au maximums.

3s 2s 1h 3h 5h 3h 2h 4h musique 1 'ici c'est année en cours 2017 puisque il n'y a pas de chaine "( )" comptage des 8 performances

Ts 5h 4h 3h (12) 5p 5p musique 2 'ici comptage de 4 perform en 2017 car à gauche de "(12)" et comptage de 2 perform 2012

0a 5a 2m Da (15) 0a 7a 5m. musique 3 'ici comptage de 4 perform 2017 car a gauche de "(15)" et comptage de 3 perform en 2015

1p 3p 0p (05) 0p 0p 1p 7p 8p musique 4 'ici comptage de 3 perfom 2017 car à gauche de"(05)" et comptage de 5 perfom en 2005

tu me dis

..Mais en tout état de cause, on réfléchit à partir de l'objectif à atteindre et des éléments de la question dont on dispose, sans préjuger de la méthode à utiliser...

justement, j'ai essayé d'expliquer dans le fichier envoyé; que le but est de faire un totale de point à chaque musiques

j'avais pris une musique d'un cheval, pour explication.

le but n'est pas de rendre l'interprétation complexe; comme tu as pu le voir dans l'ancien demandeur

tu me dis

"Tres Insuffisant" dans qu'elle sens ?

si c'est le code exposé, qui ne reflète pas ce que je veux faire, faudra être indulgent avec moi je débutes en VBA ; et j'ai eu du mal

à la mise en œuvre de la fonction LIKE, et Filter. ( ou je demande de l'aide )

par contre, si c'est mon interprétation de la musique hippique en soit; c'est réellement ainsi qu'il faut procéder.

le but rechercher: a chaque musique d'un cheval, c'est un comptage de point avec les règles des points à donner

tu me dis

Je me souviens notamment d'un demandeur qui avec esprit d'à-propos avait fourni une doc. sur la signification de chaque élément de la musique, permettant de la lire... Je n'ai pas retrouvé ça dans mes archives,

je peux le comprendre, c'est que moi j'ai mis réellement l'essentiel a une interprétation automatisée par Excel, avec 4 tableaux dans mon codes du type:

Discipline_Chevaux = Array( "plat", "monte", "attele", "obstacle", "cross", "haie", "steeple-chase")'les disciplines
Fautes_Chevaux = Array( "Disqualifie", "Tombe", "Arrete", "Retrograde")  'les fautes quel qu'ils soient = 11 points 
Places_Arrivee_Chevaux = Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9" ) 'si "0" + discipline cheval non placé = 11 points'
Annees_Courses_Chevaux= "([05-16])" 'année performances du cheval 

c'est un coup de main que je cherche, à la mise en œuvre multiple avec la méthode "LIKE, et FILTER"

cordialement.

Bonsoir,

Ce que j'attendais, c'est comme je l'ai dit un échantillon suffisamment étoffé de musiques, et pour chacune des musiques le résultat attendu !

Il semble que tu veuilles faire un calcul de moyenne de performances en valorisant par le rang si le cheval était classé, 11 pour le cas où il n'est pas classé (0 ou disqualifié, rétrogradé ou autre incident).

Dans ce cas la solution qui me paraît la plus indiquée est une fonction personnalisée qui fasse ce calcul...

Comme tu sembles vouloir différencier l'année, on pourra en tenir compte, cependant je ne te suis pas quand tu dis que à gauche de (12), (15) ou (05), c'est 2017 ! Ce que j'ai pu lire indique qu'il s'agit du changement d'année, donc respectivement à gauche des indications précitées, ce sera 2013, 2016 ou 2006... Ce que confirme les interprétations que j'ai pu lire.

Evidemment pour analyser une telle chaîne, on la splitte (l'espace étant le séparateur par défaut de la fonction on peut l'omettre).

On va utiliser Like (qui n'est pas une fonction mais un opérateur, comme +, -, *, &, etc.) pour détecter les éléments qui nous intéressent.

Mais dans la mesure où il s'agit d'établir une valeur (moyenne), il n'y a pas lieu d'opérer toutes sortes de dissociations... On élimine les éléments qui ne correspondent pas à la recherche, et on comptabilise les valeurs de ceux qui restent pour en faire la moyenne.

J'ai donc procédé à l'établissement d'une fonction comportant 3 arguments :

  • le premier obligatoire, est la musique sous forme de valeur String (on indiquera la cellule où se trouve le texte),
  • le second, optionnel, est la discipline , valeur String sous la forme où elle figure dans la musique : "a", "m", "p", "s", "h", "c",
  • le troisième, optionnel est l'année, valeur numérique (que l'on pourra indiquer sous la forme 2 chiffres ou 4).
Si l'année est omise, on n'en tient pas compte dans le calcul. Si l'année indiquée ne correspond pas à l'année entre parenthèses ou la suivante, la fonction renverra #N/A.

Si la discipline est omise, on n'en tiendra pas compte.

Si aucun résultat ne correspond à la demande, la fonction renverra #N/A, sinon elle renvoie la moyenne des valeurs trouvées.

Function VMUS(mus As String, Optional dsc, Optional an)
    Dim msk, n, a, i%, j%
    Application.Volatile
    msk = Split(mus)
    For i = 0 To UBound(msk)
        If msk(i) Like "(*)" Then
            If Not IsMissing(an) Then
                a = Val(Replace(msk(i), "(", ""))
                Select Case an Mod 100
                    Case a + 1
                        For j = i + 1 To UBound(msk)
                            msk(j) = ""
                        Next j
                    Case a
                        For j = i - 1 To 0 Step -1
                            msk(j) = ""
                        Next j
                    Case Else
                        VMUS = CVErr(xlErrNA)
                        Exit Function
                End Select
            End If
            msk(i) = "": Exit For
        End If
    Next i
    If Not IsMissing(dsc) Then
        a = "*[!" & dsc & "]"
        For i = 0 To UBound(msk)
            If msk(i) Like a Then msk(i) = ""
        Next i
    End If
    j = 0
    For i = 0 To UBound(msk)
        If msk(i) <> "" Then
            a = Val(msk(i)): j = j + 1
            n = n + IIf(a > 0, a, 11)
        End If
    Next i
    If j > 0 Then
        VMUS = n / j
    Else
        VMUS = CVErr(xlErrNA)
    End If
End Function

On n'y utilise la fonction Filter, vu qu'on ne filtre rien (cette fonction est d'ailleurs d'un emploi plutôt rare d'après mes constatations).

Quelques particularités à signaler :

  • Les arguments optionnels sont laissés de type Variant pour pouvoir utiliser IsMissing.
  • Le code est un peu long en raison de la place qu'occupe l'année : détection, prélèvement, test que l'option est demandée, élimination des éléments de l'année non voulue, et élimination de l'élément année (puisque ne contient pas de valeur).
  • La recherche de la discipline est faite sur un modèle négatif.
Exemple : si la discipline est "a", le modèle de recherche avec Like sera : "*[!a]", ce qui permet d'éliminer les éléments ne se terminant pas par "a".

Le reste ne réclame a-priori pas d'explication... La fonction s'utilise comme toute fonction d'Excel et se recalcule lors des recalculs.

Cordialement.

bonsoir,

j'ai bien pris note, de la piste que tu proposes, ainsi que tes remarques.

je le test, et commence à m'en inspirer

tu me dis

Dans ce cas la solution qui me paraît la plus indiquée est une fonction personnalisée qui fasse ce calcul...

Comme tu sembles vouloir différencier l'année, on pourra en tenir compte, cependant je ne te suis pas quand tu dis que à gauche de (12), (15) ou (05), c'est 2017 ! Ce que j'ai pu lire indique qu'il s'agit du changement d'année, donc respectivement à gauche des indications précitées, ce sera 2013, 2016 ou 2006... Ce que confirme les interprétations que j'ai pu lire.

effectivement

dans une musique hippique, quand est spécifié une année quelconque "(xx)" à gauche de celle-ci, les performances citées sont de l'année en cours actuelle.. soit 2017

par ailleurs, à droite de la chaine "(xx)" , les performances qui la suit sont celles de l'année spécifié.

si je reprends l'exemple de musique ci-dessous

0a 5a 2m Da (15) 0a 7a 5m. musique 3 'ici comptage de 4 perform 2017 car a gauche de "(15)" et comptage de 3 perform en 2015 

à droite 3 performances durant l'année 2015

soit les points suivants "0a" = 11 points car non placé + 7a = 7 points + 5m = 5 points

soit un totale de 23 points

la moyenne = 7,6

quand une année est spécifié, celle-ci est importante cela donne la fraicheur des performances, et la moyenne calculé; pour notre cas 2015 est source d'information.

avoir un sous-total de point, et moyenne quand une date est spécifiée est importante.

je rectifie mon explication

.... cependant je ne te suis pas quand tu dis que à gauche de (12), (15) ou (05), c'est 2017 ! Ce que j'ai pu lire indique qu'il s'agit du changement d'année ----> jusque là oui

si tu m' écris ...."ce sera 2013, 2016 ou 2006.." .

la règle hippique veut:

quelle que soit la date spécifiée, à gauche de 2013, sa sera (13), pour 2016 sa sera (16), ou 2006 sa sera (06)

à gauche de ces 3 chaines, les performances seront systématiquement de 2017

tout à fait; à gauche des chaines "(12), (15) ou (05), " les performances citées sont de l'année en cours soit 2017.

quelque soit l'année du type "(xx)" les performances à gauche sont systématiquement de 2017..

forcément, a droite des chaines du type "(xx)" les performances sont de la date citée "(xx)"

voila un peu les explications importantes..

et c'est important que je puisse avoir des sous-totaux de points, et moyennes en fonction des dates données dans la musique.

La musique qui spécifie (15), a été émise en 2016, ça c'est probable !

Je vois mal qu'on puisse faire se succéder des performances ("dernières performances") à 15 ans d'écart voir plus.

excuse de cette absence, du à un évènement familiale, et technique.

cela était un exemple de musique

mais les sites officiels, font mentionnés, au bon vouloir des écuries; ce qui est plus réguliers dans les performances

je te remercie, de ta piste, et que je suis entrain d'adapter ton code dans se que je veux faire

cordialement

Rechercher des sujets similaires à "fonction like filter chaine caratere"