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