Méthode itérative Excel pour décomposer champ

Résolu
coco49rico -  
rico49-29 Messages postés 5 Statut Membre -
Bonjour,

Je souhaite développer une macro qui décompose des cellules.
Le contenu d'une cellule par exemple:
C1-C10;C12-C14;C15;C17-C20
ou
TP2-TP5; TP6-TP11
...
Le point virgule est le séparateur et le tiret indique une plage.

Mon problème:
comment transformer ces exemples de cellule en
C1;C2;C3;C4;C5;C6;C7;C8;C9;C10;C12;C13;14;C5;C17;C18;C19;C20
ou
TP2;TP3;TP4;TP5;TP6;TP7;TP8;TP9;TP10;TP11

Merci pour votre aide,
Rico

4 réponses

  1. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    Bonjour,
    Voir deux fonctions...
    1°) "Replace" pour changer les tirets par des ; (point-virgule)
    2°) "Split" pour tout séparer
    Si tu ne connaît pas ces fonctions, double clic pour mettre le mot en surbrillance (sélectionner) et tape F1.
    A+
    0
  2. rico49-29 Messages postés 5 Statut Membre
     
    Merci pour la réponse mais cela ne réponds pas à ma problématique de la transformation de C1-C10 en C1;C2;C3;C4;C5;C6;C7;C8;C9;C10

    Rico
    0
  3. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    Effectivement,
    Mais avec cette macro ça devrait aller...
    Sub Remplace()
    Dim Test As String, C As String, i As Integer, e As Integer, TB1, TB2
    Dim Deb As Integer, Fin As Integer, Lettre As String
    Dim Result As String
        Test = "C1-C10;C12-C14;C15;C17-C20"
        TB1 = Split(Test, ";")
        For i = 0 To UBound(TB1)
            TB2 = Split(TB1(i), "-")
            If UBound(TB2) = 0 Then 'quand il n'y à qu'une donnée
                If Result <> "" Then Result = Result & ";"
                Result = Result & TB2(0)
            Else
                C = ""
                For e = 1 To Len(TB2(0)) 'début de la série
                    If Asc(Mid(TB2(0), e, 1)) < 65 Then Exit For
                Next e
                Deb = Val(Mid(TB2(0), e))
                Lettre = Left(TB2(0), e - 1)
                For e = 1 To Len(TB2(1)) 'fin de la série
                    If Asc(Mid(TB2(0), e, 1)) < 65 Then Exit For
                Next e
                Fin = Val(Mid(TB2(1), e))
                For e = Deb To Fin
                    C = C & ";" & Lettre & e
                Next e
                If Result <> "" Then Result = Result & ";"
                Result = Result & Mid(C, 2)
            End If
        Next i
    End Sub

    A+
    0
  4. rico49-29 Messages postés 5 Statut Membre
     
    Super, good job. Il ne me reste plus qu'à l'intégrer dans une boucle pour parcourir une liste.

    Merci encore,

    Rico
    0