从 Excel 复制多个单元格时删除引号

问题描述 投票:0回答:1

我想做的是从 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 需要安装/设置的内容)

excel vba copy-paste
1个回答
0
投票

我发现写入剪贴板的唯一可靠的代码是使用 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
© www.soinside.com 2019 - 2024. All rights reserved.