Comptage particulier dans chaîne de texte
Résolu
NoviceVBA2017
Messages postés
26
Date d'inscription
Statut
Membre
Dernière intervention
-
NoviceVBA2017 Messages postés 26 Date d'inscription Statut Membre Dernière intervention -
NoviceVBA2017 Messages postés 26 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Je fais une fois de plus appel à vos lumières!
Ma nouvelle problématique :
Je cherche à faire une comptage un peu particulier dans des chaînes de texte.
Les chaînes de textes sont constituées de la manière suivante :
S1/S2/S3/S4/S5A/S5B...
Les S# correspondent à un numéro de semaine de l'année.
Les S#A et S#B (ou S##A et S##B) correspondent au numéro de semaine qui sont à cheval sur 2 mois.
Le nombre de semaine dans la chaîne est variable.
Les semaines de début et de fin sont variables.
Il y a plusieurs lignes comportant des chaînes de texte différentes et sans lien les unes avec les autres.
(Ex:
S1/S2/S3
S1A/S2/S3A/S3B/S4/S5/S6A
S2/S3A/S3B
S1B/S2/S3A/S3B/S4/S5/S6A/S6B/S7
S1B/S2/S3A/S3B/S4/S5/S6A/S6B/S7/S8/S9/S10A
S20B/S21/S22A/S23B/S24/S25/S26A/S26B/S27/S28/S29/S30A
S20A/S20B/S21/S22A/S23B/S24/S25/S26A/S26B/S27/S28/S29/S30A
...
(je met des suites au hasard))
Mon comptage doit être fait de la manière suivante :
Si on a dans la chaîne S# ou S## on doit compter 1
Si on a dans la chaîne S##A/S##B ou S#A/S#B, on doit compter 1
Si on a S#A ou S#B ou S##A ou S##B en début ou en fin de chaîne on doit compter 1
Dans l'exemple ci-dessus, ça donne
3
6
2
7
10
10
10
La chaîne de caractère est de longueur variable.
Le nombre de S##A/S##B ou S#A/S#B est variable (il peut y en avoir 0 comme 10).
La chaîne peut commencer ou pas par un A ou B, et idem pour la fin de la chaîne.
Je souhaite que lorsque je balaye une ligne contenant une chaîne de texte de ce type, je puisse compter (selon les critères énoncés plus haut) le nombre de semaines.
J'avais l'impression que c'était facile à programmer en VBA ce genre de test mais je me rend compte que c'est bien plus complexe qu'il n'y parait (à mes yeux en tout cas).
Auriez-vous une idée?
Merci par avance.
Bien cordialement.
Je fais une fois de plus appel à vos lumières!
Ma nouvelle problématique :
Je cherche à faire une comptage un peu particulier dans des chaînes de texte.
Les chaînes de textes sont constituées de la manière suivante :
S1/S2/S3/S4/S5A/S5B...
Les S# correspondent à un numéro de semaine de l'année.
Les S#A et S#B (ou S##A et S##B) correspondent au numéro de semaine qui sont à cheval sur 2 mois.
Le nombre de semaine dans la chaîne est variable.
Les semaines de début et de fin sont variables.
Il y a plusieurs lignes comportant des chaînes de texte différentes et sans lien les unes avec les autres.
(Ex:
S1/S2/S3
S1A/S2/S3A/S3B/S4/S5/S6A
S2/S3A/S3B
S1B/S2/S3A/S3B/S4/S5/S6A/S6B/S7
S1B/S2/S3A/S3B/S4/S5/S6A/S6B/S7/S8/S9/S10A
S20B/S21/S22A/S23B/S24/S25/S26A/S26B/S27/S28/S29/S30A
S20A/S20B/S21/S22A/S23B/S24/S25/S26A/S26B/S27/S28/S29/S30A
...
(je met des suites au hasard))
Mon comptage doit être fait de la manière suivante :
Si on a dans la chaîne S# ou S## on doit compter 1
Si on a dans la chaîne S##A/S##B ou S#A/S#B, on doit compter 1
Si on a S#A ou S#B ou S##A ou S##B en début ou en fin de chaîne on doit compter 1
Dans l'exemple ci-dessus, ça donne
3
6
2
7
10
10
10
La chaîne de caractère est de longueur variable.
Le nombre de S##A/S##B ou S#A/S#B est variable (il peut y en avoir 0 comme 10).
La chaîne peut commencer ou pas par un A ou B, et idem pour la fin de la chaîne.
Je souhaite que lorsque je balaye une ligne contenant une chaîne de texte de ce type, je puisse compter (selon les critères énoncés plus haut) le nombre de semaines.
J'avais l'impression que c'était facile à programmer en VBA ce genre de test mais je me rend compte que c'est bien plus complexe qu'il n'y parait (à mes yeux en tout cas).
Auriez-vous une idée?
Merci par avance.
Bien cordialement.
A voir également:
- Comptage particulier dans chaîne de texte
- Meilleur site de vente entre particulier - Guide
- Texte de chanson gratuit pdf - Télécharger - Vie quotidienne
- Chaine tnt gratuite sur mobile - Guide
- Plus de chaine tv - Guide
- Transcription audio en texte word gratuit - Guide
3 réponses
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 584
bonjour, peux-tu partager le code que tu as déjà réalisé, et expliquer quelle partie du problème te bloque?
pour compléter ta description, peux-tu indiquer les réponses attendues pour chacun des 4 exemples?
ne serait-ce pas plus simple de faire la différence entre le numéro de la dernière et celui de la première semaine, et d'ajouter 1?
pour compléter ta description, peux-tu indiquer les réponses attendues pour chacun des 4 exemples?
ne serait-ce pas plus simple de faire la différence entre le numéro de la dernière et celui de la première semaine, et d'ajouter 1?
Bonjour,
une proposition avec une fonction personnalisée.
Je suis parti du principe que la syntaxe de la chaine est toujours correcte et ne nécessite aucun contrôle. Tu peux en ajouter dans la boucle.
https://mon-partage.fr/f/l4KbRWoF/
C'est une autre voie de résolution. Simplification de la chaine, découpage, et comptage sans doublon.
Que ça ne t'empêche de poursuivre avec yg_be ça a l'air formateur et tu en tireras des bénéfices.
Et pour comprendre la mienne : touche F1. C'est très formateur aussi et une bonne habitude à prendre ;-)
eric
une proposition avec une fonction personnalisée.
Je suis parti du principe que la syntaxe de la chaine est toujours correcte et ne nécessite aucun contrôle. Tu peux en ajouter dans la boucle.
Function nbS(ch As String) As Long Dim tmp, dict, i As Long Set dict = CreateObject("Scripting.Dictionary") If ch = "" Then Exit Function tmp = Split(Replace(Replace(Application.Trim(ch), "A", ""), "B", ""), "/") For i = 0 To UBound(tmp) dict(tmp(i)) = 1 Next i nbS = dict.Count End Function
https://mon-partage.fr/f/l4KbRWoF/
C'est une autre voie de résolution. Simplification de la chaine, découpage, et comptage sans doublon.
Que ça ne t'empêche de poursuivre avec yg_be ça a l'air formateur et tu en tireras des bénéfices.
Et pour comprendre la mienne : touche F1. C'est très formateur aussi et une bonne habitude à prendre ;-)
eric
Bonjour à vous deux,
Yg_be, c'est surprenamment simple et terriblement efficace comme approche!
J'étais en train de monter une usine à gaz qui par dessus le marché ne fonctionnait pas :-)
Eriiic, merci pour cette fonction ;-) Je vais prendre le temps de la décortiquer un peu :-)
Ce "tout petit" problème était un véritable blocage pour moi car il s'agit d'une donnée vitale pour d'autres procédures.
Alors une fois encore, merci pour vos lumières, et au plaisir de ré-échanger avec vous!
Bien à vous.
Yg_be, c'est surprenamment simple et terriblement efficace comme approche!
J'étais en train de monter une usine à gaz qui par dessus le marché ne fonctionnait pas :-)
Eriiic, merci pour cette fonction ;-) Je vais prendre le temps de la décortiquer un peu :-)
Ce "tout petit" problème était un véritable blocage pour moi car il s'agit d'une donnée vitale pour d'autres procédures.
Alors une fois encore, merci pour vos lumières, et au plaisir de ré-échanger avec vous!
Bien à vous.
Merci pour cette réponse rapide ;-)
Concernant ta seconde et troisième questions, voici un exemple un peu plus complet (mais peut-être pas exhaustif) avec le résultat attendu :
Ex:
S1/S2/S3
S1A/S2/S3A/S3B/S4/S5/S6A
S2/S3A/S3B
S1B/S2/S3A/S3B/S4/S5/S6A/S6B/S7
S1B/S2/S3A/S3B/S4/S5/S6A/S6B/S7/S8/S9/S10A
S20B/S21/S22A/S22B/S23/S24/S25A/S25B/S26/S27/S28/S29A
S20A/S20B/S21/S22A/S22B/S23/S24/S25A/S25B/S26/S27/S28/S29A
Résultat attendu
3
6
2
7
10
10
10
J'ai ajouté les 3 dernières lignes pour illustrer ma difficulté.
Concernant le code, c'est justement là où je bloque : dans l'idée même, avant de la coder, je ne sais pas comment aborder le problème. J'ai tenté ton idée, j'ai tenté des choses en comptant le nombre de "S" ou de "/" puis en retirant 1 ou 0 en fonction de la parité du nombre de A/B, j'ai tenté en comptant des demi semaines s'il y a un A ou un B, mais ça ne fonctionne pas...
explique bien pourquoi il ne convient pas: message d'erreur, résultat inattendu?
quelle est ton expérience en VBA?
Voici le code de départ que j'ai :
Sub Test()
Dim i As Integer
Dim NbrSemaines As Integer
Dim CelluleDeTravail As Range
Dim Compteur As Integer
For i = 2 To 9
Compteur = 0
Set CelluleDeTravail = Cells(i, 1)
If Left(CelluleDeTravail, 3) Like "S#A" Or Left(CelluleDeTravail, 3) Like "S#B" Or Left(CelluleDeTravail, 4) Like "S##A" Or Left(CelluleDeTravail, 4) Like "S##B" Then Compteur = Compteur + 1
If Right(CelluleDeTravail, 1) Like "A" Or Right(CelluleDeTravail, 1) Like "B" Then Compteur = Compteur + 1
'Comment compter le nombre de couple S#A/S#B et de S##A/S##B dans la chaîne de caractères et l'ajouter à la variable "Compteur"?
'Comment compter aussi le nombre de semaines sans A ou B sans faire doublon avec le comptage précédent? (celui de la ligne commentaires)
Cells(i, 2) = Compteur
Next
End Sub
et le fichier excel ci-joint pour faire l'essai.
https://www.cjoint.com/c/IAyvpdGlf6T
Le fichier compte bien s'il y a une semaine A ou B en début et/ou en fin de la chaîne, mais c'est tout...et puis j'ai l'impression que c'est un peu une méthode bourrin sans beaucoup d'élégance mais bon au point ou j'en suis, je veux juste que ça fonctionne...
Concernant mon niveau, je suis un éternel débutant, je n'ai aucune formation excel ni vba je me suis formé au grès des conseils que j'ai reçu sur les forums depuis 2/3 ans. Pardon par avance pour le manque de rigueur, et je suis preneur pour tout conseil.
si je cherche dans S1A/S1B/S2... ça ne marche pas (resultat macro : 1 ; résultat attendu pour le bout de chaîne : 2 => il y a bien 2 semaines, la S1 à cheval sur 2 mois et la S2)
si je cherche dans S1/S2A/S2B/... ça ne marche pas (resultat macro : 1 ; résultat attendu pour le bout de chaîne : 2 => il y a bien 2 semaines, la S1 et la Sé à cheval sur 2 mois)
A moins que j'ai mal compris le sens de ton message...
Merci encore pour ton aide.