Sub dispatcher()
Dim xRg As Range, xTo As Range
' les trois variables suivantes sont déclarées sans type (ou plutôt type implicite variant)
' et sans dimension => tout se passera quand on leur affectera un tableau plus tard
' au moyen de la fonction Split
Dim Ligne, Elem, xcell
' Si on annule la boîte de dialogue ou si on clique sur la croix (en haut à droite)
' une erreur se produit et dans ce cas, on continue le programme à l'instruction suivante
On Error Resume Next
' On initialise le range xRg à 'Nothing' pour pouvoir tester
' si l'utilisateur a annulé ou non la boîte de dialogue
Set xRg = Nothing
' Boîte de dialogue de saisie - type=8 indique qu'on saisit une zone.
Set xRg = Application.InputBox("Sélectionner la zone source", Type:=8)
' Si l'utilisateur a annulé la boîte de dialogue, la valeur de xRg n'a pas été modifiée
' et est donc égale à 'Nothing'. Dans ce cas, on quitte dispatcher()
If xRg Is Nothing Then Exit Sub
' on recommence la même mécanique pour la saisie de la cellule cible
Set xTo = Nothing
Set xTo = Application.InputBox("Sélectionner la cellule cible", Type:=8)
If xTo Is Nothing Then Exit Sub
' on rétablit la gestion d'erreur normale
On Error GoTo 0
' si l'utilisateur n'a pas saisi une seule cellule mais une zone, alors on affecte
' au range de la zone cible la première cellule de la zone qui correspond
' à la ligne 1 et colonne 1. S'il n'y a qu'une cellule, ça marche aussi !
Set xTo = xTo.Cells(1, 1)
' on boucle sur chaque cellule du range qui correspond à la zone source (xRg)
' si la zone source est réduite à une seule cellule alors on ne parcourera
' la boucle qu'une seule fois
For Each xcell In xRg
' On utilise la fonction 'split' qui à partir d'une valeur (ici le contenu de la cellule qu'on est en train de traiter
' dans la boucle => xcell) renvoie un tableau de base 0 (et non 1) qu'on stocke dans la variable Ligne.
' Split va décomposer le contenu de xcell en 'mots'. On indique à Split que les mots sont séparés par le
' caractère virgule ","
' exemple: SPLIT("1FG-7, HF2-100,",") renvoie un tableau Ligne de 2 éléments:
' Ligne(0) contient 1FG-7 et Ligne(1) contient HF2-100
Ligne = Split(xcell, ",")
' on boucle sur chaque élément du tableau ligne (pour l'exemple on bouclera 2 fois)
' s'il n'y a qu'une cellule dans la source mais qui qui contient 100 expressions de type 1FG-7,...,
' alors on bouclera 100 fois (car Ligne aura 100 élements)
For Each Elem In Ligne
' On réutilise la fonction 'split' qui à partir d'une valeur (ici le contenu de l'élément de ligne qu'on est
' en train de traiter = Elem) renvoie un tableau de base 0 (et non 1)
' Split va décomposer le contenu de Elem en 'mots'. On indique à Split que les mots sont séparés par le
' caractère tiret "-"
' exemple: SPLIT("1FG-7",") renvoie un tableau de 2 items:
' le premier item contient 1FG et le second item contient 7
' contrairement à plus haut on ne stocke pas ce tableau et on utilise la syntaxe suivante:
' pour désigner le 1ier item Split(Elem, "-")(0) =>1FG
' pour désigner le 2ième item Split(Elem, "-")(1) =>7
' il faut aussi savoir où écrire le résultat
' on commence par écrire dans xTo (saisie de l'utilisateur) et on y écrit la 1ière valeur (1FG)
xTo = Trim(Split(Elem, "-")(0))
' on se déplace d'une cellule à droite
Set xTo = xTo.Offset(, 1)
' on y inscrit la 2ième valeur (7)
xTo = Trim(Split(Elem, "-")(1))
' on prépare l'inscription suivante - il faut donc descendre d'une ligne (c'est le 1 du Offset)
' et revenir une cellule à gauche (c'est le -1 du Offset)
Set xTo = xTo.Offset(1, -1)
Next Elem
Next xcell
' on active la feuille où on a dispatché les cellules sources
xTo.Parent.Activate
End Sub