我想做的是从 Excel 文件中选择多个单元格并将结果粘贴到另一个程序中(现在我们说便签或记事本)。我计划使用附加到表单控制按钮的 VBA 宏来完成此操作。因此,单击该按钮将选择并复制单元格 b13:b29。然后可以将该数据粘贴到目标文本编辑器中。被复制的单元格包含多种类型的数据(纯文本、包含在dollar()函数中的数字以及包含换行符的concat()字符串。我已经解决了宏的选择/复制部分。
问题是,当我复制其中有换行符的单元格时,生成的粘贴包含开始和结束引号,如下所示:
“第一行 第二行”
我需要这些引言来腾出我的屏幕。
根据我的理解,还有一种方法可以使用 VBA 删除这些引号。 现在,这是另一个参数:这将由我的其他几位不太懂技术的同事使用。因此,该解决方案不能包括安装或引用 Microsoft Forms 2.0 库(或任何其他后端安装)的需要。
我们在 Windows 10 或 11 上使用 Microsoft 365(有些人使用 10,有些人使用 11)
预先感谢您的帮助!
我尝试过使用多个发布的 VBA 解决方案,但都需要安装 Microsoft Forms 2.0 库。当我尝试运行他们的代码时,出现错误。该解决方案不需要包括使用 MS Forms 2.0 库(或任何非 Excel 365 需要安装/设置的内容)
我发现写入剪贴板的唯一可靠的代码是使用 Microsoft HTML 对象库,如本 answer
中所述我最终完成了以下例程
Public Sub PutTextToClipboard(txt As Variant)
With CreateObject("htmlfile")
With .parentWindow.clipboardData
.SetData "text", txt
End With
End With
End Sub
现在您所要做的就是从(选定的)单元格创建一个字符串。看看下面的函数。您可以更改单元格的分隔方式,默认是每个单元格都有一个换行符:
Public Function CellsToString(r As Range, _
Optional colSeparator As String = vbCrLf, _
Optional rowSeparator As String = vbCrLf)
Dim s As String, row As Long, col As Long
For row = 1 To r.Rows.Count
s = s & IIf(row > 1, rowSeparator, "")
For col = 1 To r.Columns.Count
On Error Resume Next
Dim cellValue As String
cellValue = "???"
cellValue = CStr(r.Cells(row, col))
On Error GoTo 0
s = s & IIf(col > 1, colSeparator, "") & cellValue
Next
Next
CellsToString = s
End Function
以及按钮的代码
Sub Button1_Click()
If TypeName(Selection) <> "Range" Then
MsgBox "Select a Range first"
Exit Sub
End If
PutTextToClipboard CellsToString(Selection, " : ")
MsgBox Selection.Count & " cells written to clipboard"
End Sub