0
votes

VBA fractionnant une chaîne dans plusieurs cellules lorsqu'il a des délimiteurs variables

Si j'ai les informations ci-dessous toutes contenues dans une seule cellule et que je veux la diviser en cellules distinctes. Je comprends comment utiliser l'espace comme un délimiteur, mais dans ce cas, le nom a aussi des espaces et je souhaite que le nom reste ensemble dans une seule cellule. Pour compliquer davantage la matière, le nom n'est pas toujours juste juste en premier et le dernier, il peut également inclure le milieu, donc ce n'est pas toujours un deux noms standard.

Cell 1 = 2172242237 
Cell 2 = Mary Mixer 
Cell 3 = 2223334444 
Cell 4 = Mike M Martin


0 commentaires

4 Réponses :


0
votes

J'ai quelques idées sur ce que vous pourriez faire.

1) Lire une ligne

faire un divisé (ligne, "") et boucle via les indécieux tout en effectuant un isnumeric () sur chaque valeur de scission. Sinon, ajoutez ensuite à un tableau de chaîne () et définissez un drapeau sur TRUE.

Puis, si isnumérique alors, attendez-vous à un autre nom et à définir le drapeau sur True.

2) Lire une ligne.

Ensuite, boucle à travers chaque caractère effectuant un ISnumeric et, s'il ne l'ajoutez pas à un tableau de chaîne () et définissez le drapeau jusqu'à ce que iSnumeric est à nouveau, etc ... .

J'espère que cela aide ou du moins vous mettre dans la bonne direction.


0 commentaires

1
votes

Vous pouvez essayer:

Option Explicit

Sub test()

    Dim strToSplit As String, strImport As String
    Dim arrwords As Variant
    Dim i As Long, counter As Long

    With ThisWorkbook.Worksheets("Sheet1")
        strToSplit = .Range("A1").Value
        arrwords = Split(strToSplit, " ")

        counter = 1

        For i = LBound(arrwords) To UBound(arrwords)

            If IsNumeric(arrwords(i)) = True Then
                strImport = arrwords(i)
                .Cells(3, counter).Value = strImport
                counter = counter + 1
            ElseIf Not IsNumeric(arrwords(i)) = True Then
                If Not IsNumeric(.Cells(3, counter - 1).Value) Then
                    strImport = .Cells(3, counter - 1) & " " & arrwords(i)
                    .Cells(3, counter - 1).Value = strImport
                    counter = counter
                Else
                    strImport = arrwords(i)
                    .Cells(3, counter).Value = strImport
                    counter = counter + 1
                End If
            End If

        Next

    End With

End Sub


0 commentaires

2
votes

Cette fonction à base de regex alterne chaque scission entre les nombres et le texte (mots).

Option Explicit

Function customSplit(str As String, _
                     Optional ndx As Integer = 1) As Variant

    Static rgx As Object, cmat As Object

    Set rgx = CreateObject("VBScript.RegExp")

    With rgx
        .Global = True
        .MultiLine = True
        .IgnoreCase = True
        If CBool(ndx Mod 2) Then
            .Pattern = "[0-9]{10}"
            ndx = (ndx + 1) \ 2
        Else
            .Pattern = "[A-Z]{1,9}\s[A-Z]{1,9}[\s[A-Z]{1,9}]?"
            ndx = ndx \ 2
        End If
        If .test(str) Then
            Set cmat = .Execute(str)
            If ndx <= cmat.Count Then
                customSplit = cmat.Item(ndx - 1)
            End If
        End If
    End With

End Function


0 commentaires

0
votes

Variante supplémentaire à poster déjà:

Sub ZZZ()
    Dim dic As Object: Set dic = CreateObject("Scripting.Dictionary")
    Dim num$, cl As Range, data As Range, key, x
    Dim Result As Worksheet
    Set data = Range([A1], Cells(Rows.Count, "A").End(xlUp))
    For Each cl In data
        x = "": num = "":
        For Each x In Split(cl, " ")
            If IsNumeric(x) Then
                num = x
                dic.Add x, ""
            ElseIf x <> "" And num <> "" Then
                dic(num) = Trim(dic(num) & " " & x)
            End If
        Next x
    Next cl
    Set Result = Worksheets.Add
    With Result
        .Name = "Result " & Replace(Now, ":", "-")
        x = 1
        For Each key In dic
            .Cells(x, "A").Value2 = key
            .Cells(x, "B").Value2 = dic(key)
            x = x + 1
        Next key
        .Columns("A:B").AutoFit
    End With
End Sub


0 commentaires