Comptage particulier dans chaîne de texte

Résolu/Fermé
NoviceVBA2017 Messages postés 26 Date d'inscription dimanche 29 janvier 2017 Statut Membre Dernière intervention 6 mai 2019 - Modifié le 24 janv. 2019 à 20:00
NoviceVBA2017 Messages postés 26 Date d'inscription dimanche 29 janvier 2017 Statut Membre Dernière intervention 6 mai 2019 - 25 janv. 2019 à 18:48
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.
A voir également:

3 réponses

yg_be Messages postés 23316 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 8 novembre 2024 Ambassadeur 1 552
Modifié le 24 janv. 2019 à 20:02
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?
0
NoviceVBA2017 Messages postés 26 Date d'inscription dimanche 29 janvier 2017 Statut Membre Dernière intervention 6 mai 2019
24 janv. 2019 à 20:35
Bonjour yg_be

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...
0
yg_be Messages postés 23316 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 8 novembre 2024 1 552 > NoviceVBA2017 Messages postés 26 Date d'inscription dimanche 29 janvier 2017 Statut Membre Dernière intervention 6 mai 2019
24 janv. 2019 à 21:05
peux-tu partager le code que tu as déjà réalisé?
explique bien pourquoi il ne convient pas: message d'erreur, résultat inattendu?
quelle est ton expérience en VBA?
0
NoviceVBA2017 Messages postés 26 Date d'inscription dimanche 29 janvier 2017 Statut Membre Dernière intervention 6 mai 2019
24 janv. 2019 à 22:22
yg_be,
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.
0
yg_be Messages postés 23316 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 8 novembre 2024 1 552 > NoviceVBA2017 Messages postés 26 Date d'inscription dimanche 29 janvier 2017 Statut Membre Dernière intervention 6 mai 2019
24 janv. 2019 à 23:14
as-tu envisagé de chercher ce qu'il y a avant le premier / et ensuite ce qu'il y a après le dernier /?
0
NoviceVBA2017 Messages postés 26 Date d'inscription dimanche 29 janvier 2017 Statut Membre Dernière intervention 6 mai 2019
24 janv. 2019 à 23:30
Si j'ai bien compris ta remarque qui serait de chercher le nombre de lettres autre que "S" avant le premier "/", oui je l'ai déjà envisagé car par exemple :
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.
0
eriiic Messages postés 24600 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 21 octobre 2024 7 239
Modifié le 24 janv. 2019 à 23:55
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.
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

0
NoviceVBA2017 Messages postés 26 Date d'inscription dimanche 29 janvier 2017 Statut Membre Dernière intervention 6 mai 2019
25 janv. 2019 à 18:48
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.
0