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
4 Réponses :
J'ai quelques idées sur ce que vous pourriez faire. p>
1) Lire une ligne p>
faire un Puis, si isnumérique alors, attendez-vous à un autre nom et à définir le drapeau sur True. P>
2) Lire une ligne. P>
Ensuite, boucle à travers chaque caractère effectuant un J'espère que cela aide ou du moins vous mettre dans la bonne direction. P> divisé (ligne, "") code> et boucle via les indécieux tout en effectuant un isnumeric () code> sur chaque valeur de scission. Sinon, ajoutez ensuite à un tableau de chaîne () et définissez un drapeau sur TRUE. P>
ISnumeric code> et, s'il ne l'ajoutez pas à un tableau de chaîne () et définissez le drapeau jusqu'à ce que iSnumeric code> est à nouveau, etc ... . p>
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
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
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