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