Vous parsez souvent des données dans les produits MS Office ?
Il arrive souvent qu'on a besoin de "parser" des données (terme technique anglais qui signifie en un seul mot : récupérer des parties de texte sur la base d'un séparateur ou d'une balise). Cette fonctionnalité s'avère en particulier très utile dans les produits MS Office par exemple comme Excel, Acces, Word, Ms Project etc. La fonction VBA que je vous propose peut être implémentée comme une MACRO pour répondre à ce besoin peu importe le séparateur (caractère singleton) :
' Retourne la n ième partie du texte str sur la base du séparateur Delim
' Nmax correspond au nombre maximum des parties séparées par Delim en débutant par 0
' Exemple : GetPart("Ceci est un texte séparé par des espaces", " ", 4, 10)
' retourne : séparé
Public Function GetPart(ByVal str As String, ByVal Delim As String, ByVal n As Integer, ByVal Nmax As Integer) As String
If (Nmax - 1) < n Then GetPart = "": Exit Function
Dim i As Integer
Dim RetPart As Variant
RetPart = VBA.Split(str, Delim)
On Error Resume Next
For i = 0 To Nmax - 1
If i = n Then
If Delim <> " " Then GetPart = RetPart(i): Exit For
If InStr(1, " ", RetPart(i)) < 1 Then
GetPart = RetPart(i)
Else
Do While InStr(1, " ", RetPart(i)) >= 1
i = i + 1
Loop
GetPart = RetPart(i)
End If
Exit For
End If
Next
End Function
Cette fonction certes n'est pas optimisée quand elle est appelée autant de fois qu'il y a des parties à récupérer. Une manière de l'optimiser, est de passer en paramètre (par référence) un tableau dynamique (ou de dimension fixe) pour contenir toutes les parties à récupérer de sorte à effectuer un appel unique. Potentiellement, cette optimisation peut diviser le temps de traitement par Nmax. La fonction optimisée peut avoir la forme :
Public Function GetPart(ByVal str As String, ByVal Delim As String, ByVal Nmax As Integer, ByRef RetParties() As String) As Integer
La fonction peut retourner par exemple la dimension du tableau RetParties passé par référence. Je vous laisse le soin d'établir les détails de cette nouvelle fonction sachant que celle fournie ci-dessous peut servir de base.
Voici Le même exemple précédent implémenté dans MS Excel :
Créer un nouveau document Excel
Créer un nouveau module VBA et copier/coller la fonction ci-dessous
Saisir les cellules comme indiqué ci-dessous et faire appel à cette macro à la cellule F2 :
Voici le résultat final :
Voici le même exemple avec une ligne contenant le répertoire : C:\Windows\ehome\CreateDisc\Components\tables où il suffit de mettre un "\" comme séparateur