我有这个VBA脚本,逗号将单元格中的数据分成单独的行,例如如果单元格A1包含数据“A,B,C,D”,则此脚本将分离此数据,因此A位于一行上,B位于下一行,等等(在指定目标中)。
我正在尝试更新此脚本,以便逗号分隔数据之前的单元格中的值与每个新行连接,即如果单元格A1包含“Test”而单元格B1包含“A,B,C,D”则输出行应该是“TestA”,然后是下一行的“TestB”等。
我被困在如何继续这项任务,任何输入将是有益的,我的VBA技能不是很好。
Sub SplitAll()
Dim xRg As Range
Dim xRg1 As Range
Dim xCell As Range
Dim I As Long
Dim xAddress As String
Dim xUpdate As Boolean
Dim xRet As Variant
On Error Resume Next
xAddress = Application.ActiveWindow.RangeSelection.Address
Set xRg = Application.InputBox("Please select a range", "Kutools for Excel", xAddress, , , , , 8)
Set xRg = Application.Intersect(xRg, xRg.Worksheet.UsedRange)
If xRg Is Nothing Then Exit Sub
If xRg.Columns.Count > 1 Then
MsgBox "You can't select multiple columns", , "Kutools for Excel"
Exit Sub
End If
Set xRg1 = Application.InputBox("Split to (single cell):", "Kutools for Excel", , , , , , 8)
Set xRg1 = xRg1.Range("A1")
If xRg1 Is Nothing Then Exit Sub
xUpdate = Application.ScreenUpdating
Application.ScreenUpdating = False
For Each xCell In xRg
xRet = Split(xCell.Value, ",")
xRg1.Worksheet.Range(xRg1.Offset(I, 0), xRg1.Offset(I + UBound(xRet, 1), 0)) = Application.WorksheetFunction.Transpose(xRet)
I = I + UBound(xRet, 1) + 1
Next
Application.ScreenUpdating = xUpdate
End Sub
这是一种方法,但您需要适应添加提示用户选择范围等。
Option Explicit
Public Sub test()
Dim arr(), i As Long, k As Long, tempArr() As String, outputArr(), counter As Long
ReDim outputArr(0 To 100000) '<size to something larger than may be expected
With ThisWorkbook.Worksheets("Sheet1")
arr = .Range("A1:B2").Value '<==prompt for range input instead here
For i = LBound(arr, 1) To UBound(arr, 1)
tempArr = Split(arr(i, 2), ",")
For k = LBound(tempArr) To UBound(tempArr)
outputArr(counter) = arr(i, 1) & tempArr(k)
counter = counter + 1
Next
Next
ReDim Preserve outputArr(0 To counter - 1)
.Range("C1").Resize(UBound(outputArr) + 1) = Application.WorksheetFunction.Transpose(outputArr)
End With
End Sub
它应该做的工作:
Sub SplitAll()
Dim xRg As Range
Dim xRg1 As Range
Dim xCell As Range
Dim yCell As Range
Dim I As Long
Dim xAddress As String
Dim xUpdate As Boolean
Dim xRet As Variant
On Error Resume Next
xAddress = Application.ActiveWindow.RangeSelection.Address
Set xRg = Application.InputBox("Please select a range", "Kutools for Excel", xAddress, , , , , 8)
Set xRg = Application.Intersect(xRg, xRg.Worksheet.UsedRange)
If xRg Is Nothing Then Exit Sub
If xRg.Columns.Count > 1 Then
MsgBox "You can't select multiple columns", , "Kutools for Excel"
Exit Sub
End If
Set xRg1 = Application.InputBox("Split to (single cell):", "Kutools for Excel", , , , , , 8)
Set xRg1 = xRg1.Range("A1")
If xRg1 Is Nothing Then Exit Sub
xUpdate = Application.ScreenUpdating
Application.ScreenUpdating = False
For Each xCell In xRg
xRet = Split(xCell.Value, ",")
xRg1.Worksheet.Range(xRg1.Offset(I, 0), xRg1.Offset(I + UBound(xRet, 1), 0)) = Application.WorksheetFunction.Transpose(xRet)
For Each yCell In xRg1.Worksheet.Range(xRg1.Offset(I, 0), xRg1.Offset(I + UBound(xRet, 1), 0))
yCell.Value = yCell.Value & xCell.Offset(0, -1).Value
Next yCell
I = I + UBound(xRet, 1) + 1
Next
Application.ScreenUpdating = xUpdate
End Sub