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 :
parser macro

Voici le résultat final :
parser final result

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
parser folder

ParserTélécharger le document Excel correspondant