我在 Excel 电子表格中有一些数据需要重新格式化。现有格式是按行排列的。所需格式是以逗号分隔的。
在超级用户的其他地方,我发现了一个 VBA 脚本,它能帮我完成大约 75% 的任务...
Sub generatecsv()
Dim i As Integer
Dim s As String
i = 1
Do Until Cells(i, 1).Value = ""
If (s = "") Then
s = Cells(i, 1).Value
Else
s = s & "," & Cells(i, 1).Value
End If
i = i + 1
Loop
Cells(1, 2).Value = s
End Sub
对于我预期的工作流程来说,这个脚本的缺点目前是:
单元格范围必须始终位于第 1 列。我需要让脚本从工作表中任意位置的选定范围获取输入。
脚本的输出总是出现在单元格(1,2)。我想将其复制到剪贴板。
我希望 s.Copy 或 s.PutInClipboard 之类的东西能够起作用,但却出现了错误。
数据如下:
Topic 1
Mike
Tony
Dave
Topic 2
Steve
Joe
Sally
Topic 3
...
期望的输出是:
Mike, Tony, Dave
(在剪贴板中)
然后在下一次迭代中:
Steve, Joe, Sally
(在剪贴板中)
答案1
首先,在包含宏的工作簿中,在 VBA IDE 中,转到工具->引用并添加对“Microsoft Forms 2.0 对象库”的引用(我的系统上的文件路径是C:\Windows\system32\FM20.DLL
。)
然后尝试这个宏。这个宏会将“选定”(突出显示)的数据放在剪贴板上。如果您选择同一行中的一系列单元格,它将从左到右;如果您选择同一列中的一系列单元格,它将从上到下。
如果需要对行和列进行复合(选择多个行和多个列的矩形形状),可以添加如下代码:
MsgBox "Row: " & cell.Row & " Column: " & cell.Column
以便确定正在枚举哪些行号(基于 1)和列号(A=1)以及按什么顺序枚举。
如果您需要将数据放入剪贴板,然后等待用户操作,然后自动将下一组数据放入剪贴板,则必须修改此宏。从您的问题中不清楚您所说的“选定”到底是什么意思。
Sub su492198()
Dim cell As Range
Dim sel As Range
Dim output As String
Dim first As Boolean
Dim dat As New DataObject
first = True
output = ""
On Error GoTo Errhndl
Set sel = Selection
On Error GoTo 0
For Each cell In sel.Cells
If first = False Then output = output & ", "
output = output & cell.Value
first = False
Next
On Error GoTo Errclip
dat.SetText output
dat.PutInClipboard
On Error GoTo 0
Exit Sub
Errhndl:
MsgBox "Can't use this macro if nothing is selected or a non-cell object is selected"
Exit Sub
Errclip:
MsgBox "Error copying text to clipboard! Text was: " & output
End Sub