Gestion de chaine de caratère sous VBA [Résolu]

Signaler
Messages postés
12081
Date d'inscription
dimanche 19 janvier 2014
Statut
Membre
Dernière intervention
25 septembre 2020
-
Messages postés
8186
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
20 septembre 2020
-
Bonjour,

Je suis sur un projet de récupération de données sportives venant d'un site pour les transférer sur Wikipedia.
Je télécharge la page web du site dans mon fichier Excel, et je lance une macro pour manipuler les données. Et, au final, j'obtiens un résultat que je n'ai plus qu'à coller dans Wikipédia.
Le résultat est déjà satisfaisant cependant, j'aurais souhaité améliorer certains détails.

Actuellement, je parviens à réaliser une ligne avec l'ensemble des joueurs qui ont marqué un but pour une équipe. Un but génère l'incrémentation du buteur à la suite des autres.
Ex. :
|buts 1=JoueurA<br>JoueurB<br>JoueurC<br>JoueurC<br>JoueurA<br>JoueurD<br>JoueurC

Je voudrais retraiter cette ligne dans l'objectif que le nom d'un même joueur n'apparaisse qu'une seule fois et que le nombre de but inscrit soit indiqué entre parenthèse à côté.
Ex. :
|buts 1=JoueurA (2)<br>JoueurB <br>JoueurC (3) <br>JoueurD

Comment procéder ?

Merci d'avance,

Bonne journée

1 réponse

Messages postés
8186
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
20 septembre 2020
19
Bonjour,

Exemple de traitement de la ligne :
Option Explicit
Sub test()
'
Dim d As Object
Dim b As String
Dim s As String
Dim t As Variant
Dim i As Integer
Dim k As Variant

  b = "|buts 1=JoueurA<br>JoueurB<br>JoueurC<br>JoueurC<br>JoueurA<br>JoueurD<br>JoueurC "
  ' Partie utile de la chaine
  s = Mid(b, InStr(1, b, "=") + 1, Len(b))
  ' Tableau des joueurs
  t = Split(s, "<br>")
  ' Comptage des joueurs
  Set d = CreateObject("Scripting.Dictionary")
  For i = LBound(t) To UBound(t)
    d(t(i)) = d(t(i)) + 1
  Next i
  ' Reconstitution de la chaine
  s = Mid(b, 1, InStr(1, b, "="))
  For Each k In d.Keys
    s = s & k & "(" & d(k) & ")<br>"
  Next k
  s = Left(s, Len(s) - 4)
  MsgBox b & vbCrLf & s
  
End Sub


Cordialement
Patrice
Messages postés
12081
Date d'inscription
dimanche 19 janvier 2014
Statut
Membre
Dernière intervention
25 septembre 2020

Merci du retour, le résultat répond parfaitement à mes attentes.

Charge à moi de prendre du temps pour bien tout comprendre.

Merci et bonne soirée
Messages postés
8186
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
20 septembre 2020
19
Tu trouvera des explications concernant les dictionnaires (et bien d'autres) sur l'excellent site de Jacques Boisgontier :
http://boisgontierjacques.free.fr/pages_site/Dictionnaire.htm