我有一個匯入的單元格,其中有兩個名稱,如下所示:“Firstname LastnameFirstname2 Lastname2”。如何使用 VBA 將其拆分為一個單元格為“Firstname Lastname”,另一個單元格為“Firstname2 Lastname2”?一個具體的例子是:將“Nick MartinezMackenzie Gore”拆分為“Nick Martinez”和“Mackenzie Gore”。
uj5u.com熱心網友回復:
如果我理解得很好,您需要拆分那些被視為一個文本的單詞(名稱),然后將它們設定在如上所述的單獨單元格中。如果這是正確的嘗試使用下面的代碼:
Sub SplitWords()
Dim TextStrng As String
Dim Result() As String
For i = 2 To 10
TextStrng = Cells(i, 1)
Result() = Split(TextStrng)
Cells(i, 2) = Result(0) & " " & Result(2)
Cells(i, 3) = Result(1)
Next i
結果 :

uj5u.com熱心網友回復:
下面的代碼假設輸入字串模式是一致的:firstname1、lastname1、firstname2、lastname2 的第一個字符是大寫字母。

因此,將 fn1 ln1 與 fn2 ln2 分開的邏輯是:在輸入字串中找到的第三個大寫字母上。
Sub test()
Dim rg As Range: Dim cell As Range
Dim txt As String: Dim char As String
Dim cnt As Long: Dim pos As Long
With ActiveSheet
Set rg = .Range("A2", .Range("A2").End(xlDown))
End With
cnt = 0
For Each cell In rg
txt = cell.Value
For pos = 1 To Len(txt)
char = Mid(txt, pos, 1)
If char <> " " Then If UCase(char) = char Then cnt = cnt 1
If cnt = 3 Then
cell.Offset(0, 1).Value = Left(txt, pos - 1)
cell.Offset(0, 2).Value = Mid(txt, pos)
Exit For
End If
Next pos
cnt = 0
Next cell
End Sub
流程:
在活動作業表A列中創建輸入字串的rg變數。
回圈rg的每一行并將值作為txt變數
然后回圈到txt中的每個字符,將char的位置作為pos變數并將字符作為char變數的值。
檢查,如果 char 值的大寫與 char 值本身相同,則它在 cnt 變數中創建一個計數器
一旦 cnt 達到 3,則意味著 pos(ition) 是第三個帶有大寫字母的 char 值的位置。因此,使用 LEFT 函式獲取 fn1 ln1,使用 MID 函式獲取 fn2 ln2。

uj5u.com熱心網友回復:
這也可以使用 Windows Excel 2010 和 Excel 365(Windows 或 Mac)中提供的 Power Query 來完成
使用 Power Query
- 在資料表中選擇一些單元格
Data => Get&Transform => from Table/Range或者from within sheet- 當 PQ 編輯器打開時:
Home => Advanced Editor - 記下第 2 行中的表名
- 粘貼下面的 M 代碼代替您看到的內容
- 將第 2 行中的表名稱更改回最初生成的名稱。
- 請注意,“拆分器”只是一個步驟——檢查應用的步驟
M代碼
let
Source = Excel.CurrentWorkbook(){[Name="Table4"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Names", type text}}),
#"Split Column by Character Transition" =
Table.SplitColumn(#"Changed Type", "Names",
Splitter.SplitTextByCharacterTransition({"a".."z"}, {"A".."Z"}), {"Names.1", "Names.2"})
in
#"Split Column by Character Transition"
原來的

結果

如果您絕對必須使用 VBA,這里的代碼會將拆分后的名稱作為 2 列范圍回傳。有一個使用正則運算式拆分名稱的函式;和一個宏 (Sub),它采用 A 列中的值,并在另一個區域回傳拆分后的名稱。編輯以適合您的具體情況
Option Explicit
Function splitNames(ByVal S As String)
Dim MC As Object
Dim vTemp(1)
With CreateObject("vbscript.regexp")
.ignorecase = False
.Pattern = "([A-Z][A-Za-z\s] [a-z])([A-Z][A-Za-z\s] [a-z])"
If .Test(S) = True Then
Set MC = .Execute(S)
vTemp(0) = MC(0).submatches(0)
vTemp(1) = MC(0).submatches(1)
End If
End With
splitNames = vTemp
End Function
Sub splitIt()
Dim vSrc As Variant, vRes As Variant, rRes As Range, v As Variant
Dim I As Long
With ThisWorkbook.Worksheets("Sheet2")
vSrc = Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp))
Set rRes = .Cells(1, 10) 'or set to original if you want to overwrite
End With
ReDim vRes(1 To UBound(vSrc, 1), 1 To 2)
vRes(1, 1) = "Name.1"
vRes(1, 2) = "Name.2"
For I = 2 To UBound(vSrc, 1)
v = splitNames(vSrc(I, 1))
vRes(I, 1) = v(0)
vRes(I, 2) = v(1)
Next I
Set rRes = rRes.Resize(UBound(vRes, 1), UBound(vRes, 2))
With rRes
.Clear
.Value = vRes
.EntireColumn.AutoFit
End With
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/490354.html
上一篇:有沒有可能將求解器用作函式?
下一篇:@DataJpaTest忽略@Column(unique=true)和@Column(nullable=false)
