将剪贴板中的一系列行转换为逗号分隔的列表

将剪贴板中的一系列行转换为逗号分隔的列表

我在 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

相关内容