【问题标题】:Leave out quotes when copying from cell从单元格复制时省略引号
【发布时间】:2014-09-14 15:01:17
【问题描述】:

问题
在程序外部从 Excel 复制单元格时,会自动添加双引号。

详情
我在 Windows 7 机器上使用 Excel 2007。如果我有一个具有以下公式的单元格:

="1"&CHAR(9)&"SOME NOTES FOR LINE 1."&CHAR(9)&"2"&CHAR(9)&"SOME NOTES FOR LINE 2."

单元格中的输出(格式为数字)在 Excel 中如下所示:

1SOME NOTES FOR LINE 1.2SOME NOTES FOR LINE 2.

很好。但是,如果我将单元格复制到另一个程序(例如记事本)中,我会在开头和结尾出现烦人的双引号。请注意,由“CHAR(9)”创建的选项卡被保留,这很好。

"1  SOME NOTES FOR LINE 1.  2     SOME NOTES FOR LINE 2."

当我复制到另一个程序时,如何防止这些双引号出现?换句话说,当单元格被复制到剪贴板时,我可以防止这些被自动添加吗?

【问题讨论】:

  • 您是否尝试将格式更改为数字以外的格式?我想我已经找到了解决方法,但我现在无法打开 Excel,如果仍然没有答案,我会在几分钟后回来。
  • @McAdam331 在我的设置中,如果格式类似于文本,则单元格显示公式,而不是计算结果。由于某种原因,格式化为数字似乎会覆盖这一点。
  • 你为什么选择使用这个公式?是因为 Excel 不支持插入制表符的简单方法吗?我似乎也无法解决这个问题,也许您可​​以使用 Excel 以外的其他选项,但我不确定该项目的性质是什么。
  • 另外,这可能很麻烦,但如果您打开 Excel 并开始输入一个单元格(默认格式为“常规”)并输入文本,它将不带引号复制。 (使用 Excel 2013 和 Notepad++ 测试)仅输入 4 个空格而不是制表符会影响您的项目吗?同样,如果不知道问题的其余部分,很难说。
  • @McAdam331 不幸的是,我需要它完全按照我在这里的方式工作,减去前导和尾随双引号。请不要让选项卡偏离这个问题的重点——它们必须在那里。

标签: excel clipboard


【解决方案1】:

如果您尝试粘贴到 Word-Pad、Notepad++ 或 Word 中,则不会出现此问题。 要将单元格值复制为纯文本,要实现您所描述的内容,您必须使用宏:

在您希望应用此功能的工作簿中(或在您的 Personal.xls 中,如果您想跨多个工作簿使用),将以下代码放在标准模块中:

代码:

Sub CopyCellContents()
'create a reference in the VBE to Microsft Forms 2.0 Lib
' do this by (in VBA editor) clicking tools - > references and then ticking "Microsoft Forms 2.0 Library"
Dim objData As New DataObject
Dim strTemp As String
strTemp = ActiveCell.Value
objData.SetText (strTemp)
objData.PutInClipboard
End Sub

要将标准模块添加到您的项目(工作簿),请使用 Alt+F11 打开 VBE,然后右键单击左上角项目中的工作簿窗口并选择插入>模块。将代码粘贴到右侧打开的代码模块窗口中。

返回 Excel,转到工具>宏>宏并选择名为“CopyCellContents”的宏,然后从对话框中选择选项。在这里,您可以将宏分配给快捷键(例如,CTRL+C 用于普通复制) - 我使用 CTRL+Q .

然后,当您想将单个单元格复制到记事本/任何地方时,只需执行 Ctrl+q(或您选择的任何内容),然后执行 CTRL+V 或编辑>粘贴到您选择的目的地。

我的答案是从here复制的(有一些补充)

编辑:(来自 cmets)

如果您在参考列表中没有找到 Microsoft Forms 2.0 库, 你可以试试

  • 正在寻找 FM20.DLL(感谢 @Peter Smallwood)
  • 单击浏览并选择C:\Windows\System32\FM20.dll(32 位 Windows)(感谢@JWhy)
  • 单击浏览并选择C:\Windows\SysWOW64\FM20.dll (在 64 位上)

【讨论】:

  • 看起来 VBA 是唯一的解决方案 - 感谢您的输入。
  • 如果您在参考列表中看不到 Microsoft Forms 库,请浏览 FM20.DLL
  • 如果我粘贴到 Notepad++ 中,我仍然会得到引号。
  • @monkeyintern 我想我在一个单元格中有多行文本,将它们分成每个单元格一行让我绕过它。
  • @user3616725 更新的版本可能改变了这种行为,但当前版本的 Word 和 Notepad++(截至本评论发布日期)在选择单个或多个单元格时会粘贴这些引号。
【解决方案2】:

我刚刚遇到了这个问题,并用CLEAN 函数为我解决了这个问题。通过=CLEAN(,选择您的单元格,然后自动填充列的其余部分,这应该相对容易。在我这样做之后,粘贴到记事本或任何其他程序中不再有重复的引号。

【讨论】:

  • 删除多余引号的好答案,但不幸的是它也会删除制表符......在问题中,我想保留。感谢您的意见!
  • 这对我有用,我不关心标签 - 事实上我希望所有标签和换行符都被删除。
  • 它会删除所有低于 32 的 ASCII 字符。所以新行也是如此。
  • 这才是真正的答案。
  • 这不是一个好的解决方案,因为它会删除所有特殊字符。
【解决方案3】:

先粘贴到Word中,再粘贴到记事本中,会出现不带引号的

【讨论】:

  • 感谢您的意见,但我不能将此标记为一个好的解决方案。另外,它是已针对此问题提供的解决方案的副本,请参阅stackoverflow.com/a/24913557/2658159
  • 谢谢,我喜欢这个解决方案。快速简单
  • 支持这个...就我而言,我的问题是,对于我收到的特定类型的请求,数据来自 Excel 文件,我需要将其粘贴到纯文本框中。当我这样做时,我会得到报价。我使用文本编辑器删除了多余的引号(它也引用了引号......烦人!)。在寻找一个简单的解决方案时,我发现粘贴到 Word 首先可以工作,因为多余的引号已经消失了。希望我能投票给这 10 倍 :)
  • 这将删除制表符。至少在使用 word 时,不确定 wordpad
  • 即使在今天,这也是最好的解决方案。
【解决方案4】:

要在记事本中粘贴时保留换行符,请在宏中替换此行:

strTemp = ActiveCell.Value

作者:

strTemp = Replace(ActiveCell.Value, Chr(10), vbCrLf)

【讨论】:

    【解决方案5】:

    与“user3616725”的回答有关的可能问题:
    我在 Windows 8.1 上,从“user3616725”接受的答案中链接的 VBA 代码似乎有问题:

    Sub CopyCellContents()
     ' !!! IMPORTANT !!!:
     ' CREATE A REFERENCE IN THE VBE TO "Microsft Forms 2.0 Library" OR "Microsft Forms 2.0 Object Library"
     ' DO THIS BY (IN VBA EDITOR) CLICKING TOOLS -> REFERENCES & THEN TICKING "Microsoft Forms 2.0 Library" OR "Microsft Forms 2.0 Object Library"
     Dim objData As New DataObject
     Dim strTemp As String
     strTemp = ActiveCell.Value
     objData.SetText (strTemp)
     objData.PutInClipboard
    End Sub
    

    详情:
    运行上面的代码并将剪贴板粘贴到 Excel 中的单元格中,我得到两个由正方形组成的符号,里面有一个问号,如下所示:⍰⍰。粘贴到记事本甚至不显示任何内容。

    解决方案:
    经过一段时间的搜索,我找到了another VBA script from user "Nepumuk" which makes use of the Windows API。这是他最终对我有用的代码:

    Option Explicit
    
    Private Declare Function OpenClipboard Lib "user32.dll" ( _
        ByVal hwnd As Long) As Long
    Private Declare Function CloseClipboard Lib "user32.dll" () As Long
    Private Declare Function EmptyClipboard Lib "user32.dll" () As Long
    Private Declare Function SetClipboardData Lib "user32.dll" ( _
        ByVal wFormat As Long, _
        ByVal hMem As Long) As Long
    Private Declare Function GlobalAlloc Lib "kernel32.dll" ( _
        ByVal wFlags As Long, _
        ByVal dwBytes As Long) As Long
    Private Declare Function GlobalLock Lib "kernel32.dll" ( _
        ByVal hMem As Long) As Long
    Private Declare Function GlobalUnlock Lib "kernel32.dll" ( _
        ByVal hMem As Long) As Long
    Private Declare Function GlobalFree Lib "kernel32.dll" ( _
        ByVal hMem As Long) As Long
    Private Declare Function lstrcpy Lib "kernel32.dll" ( _
        ByVal lpStr1 As Any, _
        ByVal lpStr2 As Any) As Long
    
    Private Const CF_TEXT As Long = 1&
    
    Private Const GMEM_MOVEABLE As Long = 2
    
    Public Sub Beispiel()
        Call StringToClipboard("Hallo ...")
    End Sub
    
    Private Sub StringToClipboard(strText As String)
        Dim lngIdentifier As Long, lngPointer As Long
        lngIdentifier = GlobalAlloc(GMEM_MOVEABLE, Len(strText) + 1)
        lngPointer = GlobalLock(lngIdentifier)
        Call lstrcpy(ByVal lngPointer, strText)
        Call GlobalUnlock(lngIdentifier)
        Call OpenClipboard(0&)
        Call EmptyClipboard
        Call SetClipboardData(CF_TEXT, lngIdentifier)
        Call CloseClipboard
        Call GlobalFree(lngIdentifier)
    End Sub
    

    要像上面第一个 VBA 代码一样使用它,请将 Sub "Beispiel()" 更改为:

    Public Sub Beispiel()
        Call StringToClipboard("Hallo ...")
    End Sub
    

    收件人:

    Sub CopyCellContents()
        Call StringToClipboard(ActiveCell.Value)
    End Sub
    

    并通过 Excel 宏菜单运行它,如接受答案中“user3616725”的建议:

    返回 Excel,转到工具>宏>宏并选择名为 “CopyCellContents”,然后从对话框中选择选项。你在这里 可以将宏分配给快捷键(例如 Ctrl+c 用于正常 复制) - 我使用了 Ctrl+q。

    然后,当您想将单个单元格复制到记事本/任何地方时, 只需执行 Ctrl+q (或您选择的任何内容),然后执行 Ctrl+v 或 编辑>粘贴到您选择的目的地。


    编辑(2015 年 11 月 21 日):
    @来自“dotctor”的评论:
    不,这真的不是新问题!在我看来,这是对已接受答案的一个很好的补充,因为我的答案解决了您在使用已接受答案中的代码时可能遇到的问题。如果我有更多的声誉,我会创建一个评论。
    @来自“Teepeemm”的评论:
    是的,您是对的,以标题“问题:”开头的答案具有误导性。更改为:“与来自“user3616725”的答案相关的可能问题:”。作为评论,我当然会写得更紧凑。

    【讨论】:

    • 我认为这是一个有效的答案(尽管以 Problem 开头让您看起来好像遇到了一个新问题)。而且 cmets 的上限为 600 个字符,所以这肯定太长了。
    • 太棒了!谢谢!唯一的问题似乎是它只适用于单个单元格。是否可以以某种方式改进以允许复制范围?
    【解决方案6】:

    请使用以下公式

    =Clean("1"&CHAR(9)&"SOME NOTES FOR LINE 1."&CHAR(9)&"2"&CHAR(9)&"SOME NOTES FOR LINE 2.")
    

    你会得到你想要的;-)

    【讨论】:

    • 这可以解决问题,但会删除我的格式(新行和制表符)
    【解决方案7】:

    如果您想选择 多个 单元格并将它们的值复制到剪贴板而不使用所有那些烦人的引号,那么以下代码可能会很有用。这是对上面来自 user3616725 的代码的增强。

    Sub CopyCells()
     'Attach Microsoft Forms 2.0 Library: tools\references\Browse\FM20.DLL
     'Then set a keyboard shortcut to the CopyCells Macro (eg Crtl T)
     Dim objData As New DataObject
     Dim cell As Object
     Dim concat As String
     Dim cellValue As String
     CR = ""
      For Each cell In Selection
      If IsNumeric(cell.Value) Then
       cellValue = LTrim(Str(cell.Value))
      Else
       cellValue = cell.Value
      End If
      concat = concat + CR + cellValue
      CR = Chr(13)
     Next
     objData.SetText (concat)
     objData.PutInClipboard
    End Sub
    

    【讨论】:

    • 我认为这是迄今为止最好的答案。
    • 查看基于此答案的我的答案,该答案修复了以下错误:1. 将空单元格转换为空字符串与“0”。 2. 在每个单元格之后附加 Tab (ASCII 9) vs. CR (ASCII 13)。 3. 在每一行之后附加一个 CR (ASCII 13) + LF (ASCII 10)(对比 CR (ASCII 13))。注意:您仍然无法复制嵌入在单元格中的字符,这会导致您正在将该单元格粘贴到的目标字段退出(即粘贴到访问或 SSMS 的编辑表窗口时的 Tab 或 CR)。
    • ^还修复了“变量未定义”编译器错误(对于“CR”变量)。
    【解决方案8】:

    当我遇到引号问题时,我的解决方案是从单元格文本的末尾删除回车符。由于这些回车(由外部程序插入),Excel 在整个字符串中添加了引号。

    【讨论】:

    • 引号也可能是公式中的 CR/LF 的结果(不一定在末尾),或者是这个线程原始问题中的选项卡(char(9))。跨度>
    • 你真的让我的生活变得轻松
    【解决方案9】:

    也可以通过将结果放在“清理”函数上来删除这些双引号。

    例子:

    =CLEAN("1"&CHAR(9)&"SOME NOTES FOR LINE 1."&CHAR(9)&"2"&CHAR(9)&"SOME NOTES FOR LINE 2.")
    

    在其他程序(如 Notepad++)上,输出将不带双引号粘贴。

    【讨论】:

    • 这是一个重复的答案。 CLEAN 还会去除换行符、制表符等。
    【解决方案10】:

    “如果您想选择 多个 单元格并将它们的值复制到剪贴板而不使用所有那些烦人的引号”(没有 Peter Smallwood 的多单元解决方案中的错误)“以下代码可能有用。”这是对以上来自 Peter Smallwood 的代码的增强(“它是对以上来自 user3616725 的代码的增强”)。这修复了 Peter Smallwood 解决方案中的以下错误:

    • 避免“变量未定义”编译器错误(此处为“CR”-“clibboardFieldDelimiter”)
    • 将空单元格转换为空字符串与“0”。
    • 在每个单元格之后附加 Tab (ASCII 9) 与 CR (ASCII 13)。
    • 在每行之后附加一个 CR (ASCII 13) + LF (ASCII 10)(相对于 CR (ASCII 13))。

    注意:您仍然无法复制嵌入在单元格中的字符,这会导致您将该单元格粘贴到的目标字段退出(即粘贴到访问的编辑表窗口时的 Tab 或 CR 或SSMS)。


    Option Explicit
    
    Sub CopyCellsWithoutAddingQuotes()
    
    ' -- Attach Microsoft Forms 2.0 Library: tools\references\Browse\FM20.DLL
    ' -- NOTE: You may have to temporarily insert a UserForm into your VBAProject for it to show up.
    ' -- Then set a Keyboard Shortcut to the "CopyCellsWithoutAddingQuotes" Macro (i.e. Crtl+E)
    
    Dim clibboardFieldDelimiter As String
    Dim clibboardLineDelimiter As String
    Dim row As Range
    Dim cell As Range
    Dim cellValueText As String
    Dim clipboardText As String
    Dim isFirstRow As Boolean
    Dim isFirstCellOfRow As Boolean
    Dim dataObj As New dataObject
    
    clibboardFieldDelimiter = Chr(9)
    clibboardLineDelimiter = Chr(13) + Chr(10)
    isFirstRow = True
    isFirstCellOfRow = True
    
    For Each row In Selection.Rows
    
        If Not isFirstRow Then
            clipboardText = clipboardText + clibboardLineDelimiter
        End If
    
        For Each cell In row.Cells
    
            If IsEmpty(cell.Value) Then
    
                cellValueText = ""
    
            ElseIf IsNumeric(cell.Value) Then
    
                cellValueText = LTrim(Str(cell.Value))
    
            Else
    
                cellValueText = cell.Value
    
            End If ' -- Else Non-empty Non-numeric
    
            If isFirstCellOfRow Then
    
                clipboardText = clipboardText + cellValueText
                isFirstCellOfRow = False
    
            Else ' -- Not (isFirstCellOfRow)
    
                clipboardText = clipboardText + clibboardFieldDelimiter + cellValueText
    
            End If ' -- Else Not (isFirstCellOfRow)
    
        Next cell
    
        isFirstRow = False
        isFirstCellOfRow = True
    
    Next row
    
    clipboardText = clipboardText + clibboardLineDelimiter
    
    dataObj.SetText (clipboardText)
    dataObj.PutInClipboard
    
    End Sub
    

    【讨论】:

      【解决方案11】:

      您可以通过 VBA 在 Excel 宏中执行此操作,将结果发送到文件:

      Sub SimpleVBAWriteToFileWithoutQuotes()
          Open "c:\TEMP\Excel\out.txt" For Output As #1
          Print #1, Application.ActiveSheet.Cells(2, 3)
          Close #1
      End Sub
      

      如果您想将文件名和内容放入多个文件中,这里有一个简短的 sn-p,可以避免输出周围的双引号。

      Sub DumpCellDataToTextFilesWithoutDoubleQuotes()
          ' this will work for filename and content in two different columns such as:
          ' filename column       data column
          ' 101                   this is some data
          ' 102                   this is more data
      
          Dim rngData As Range
          Dim strData As String
          Dim strTempFile As String
          Dim strFilename As String
          Dim i As Long
          Dim intFilenameColumn As Integer
          Dim intDataColumn As Integer
          Dim intStartingRow As Integer
      
          intFilenameColumn = 1     ' the column number containing the filenames
          intDataColumn = 3         ' the column number containing the data
          intStartingRow = 2        ' the row number to start gathering data
      
      
          For i = intStartingRow To Range("A1", Range("A1").End(xlDown)).Rows.Count
      
              ' copy the data cell's value
              Set rngData = Application.ActiveSheet.Cells(i, intDataColumn)
      
              ' get the base filename
              strFilename = Application.ActiveSheet.Cells(i, intFilenameColumn)
      
              ' assemble full filename and path
              strTempFile = "w:\TEMP\Excel\" & strFilename & ".txt"
      
              ' write to temp file
              Open strTempFile For Output As #1
              Print #1, rngData
              Close #1
      
          Next i
      
          ' goto home cell
          Application.ActiveSheet.Cells(1, 1).Select
          Range("A1").ClearOutline
      End Sub
      

      【讨论】:

        【解决方案12】:
        • 如果公式具有多行(意味着公式中有换行符),则复制粘贴将以这种方式工作
        • 如果可以删除多行,则复制粘贴时不会出现引号。
        • else use CLEAN function as said by @greg in previous answer

        【讨论】:

          【解决方案13】:

          注意:引号的原因是当数据从 excel 移动到剪贴板时,它完全符合 CSV 标准,其中包括引用值,包括制表符、新行等(双引号字符被替换为两个双引号字符)

          因此,另一种方法,特别是在 OP 的情况下,当制表符/新行归因于公式时,是使用替代字符作为制表符和硬回车。我将 ascii Unit Separator =char(31) 用于制表符,将 ascii Record Separator =char(30) 用于新行。

          然后粘贴到文本编辑器将不会涉及额外的 CSV 规则,您可以进行快速搜索和替换以再次将它们转换回来。

          如果数据中嵌入了制表符/换行符,您可以在 excel 中进行搜索和替换以进行转换。

          无论是使用公式还是更改数据,选择分隔符的关键是永远不要使用实际数据中可能存在的字符。这就是我推荐低级 ascii 字符的原因。

          【讨论】:

            【解决方案14】:

            我遇到了同样的问题,这篇文章的解决方案都没有帮助我。 然后我将分享对我来说绝对有效的解决方案,以防其他人可能处于同样的情况。

            首先,此解决方案还符合最近向 Microsoft 报告的一个错误,当用户使用文件资源管理器访问任何“快速访问文件夹”时,在使用 VBA 进行任何修改后,该错误会导致剪贴板内容转换为不可读的内容。

            复制过去错误的解决方案的文档,该代码将在此答案中使用,以从剪贴板中删除引号:https://docs.microsoft.com/en-us/office/vba/access/Concepts/Windows-API/send-information-to-the-clipboard

            您需要如下构建一个宏,并为其指定“ctrl+c”作为热键。 (热键分配=开发者选项卡,宏,点击宏,选项,然后在热键字段中输入字母“c”)。

            Sub ClipboardRemoveQuotes()
                Dim strClip As String
                strClip = Selection.Copy
                strClip = GetClipboard()
                On Error Resume Next - Needed in case clipboard is empty
                strClip = Replace(strClip, Chr(34), "") 
                On Error GoTo 0
                SetClipboard (strClip)
            End Sub
            

            这仍然需要您构建函数“SetClipboard”和“GetClipboard”。

            下面我们定义了“SetClipboard”和“GetClipboard”函数,并进行了一些调整以适应不同的excel版本。 (将下面的代码放在一个模块中)

                Option Explicit
            #If VBA7 Then
                Private Declare PtrSafe Function OpenClipboard Lib "User32" (ByVal hWnd As LongPtr) As LongPtr
                Private Declare PtrSafe Function EmptyClipboard Lib "User32" () As LongPtr
                Private Declare PtrSafe Function CloseClipboard Lib "User32" () As LongPtr
                Private Declare PtrSafe Function IsClipboardFormatAvailable Lib "User32" (ByVal wFormat As LongPtr) As LongPtr
                Private Declare PtrSafe Function GetClipboardData Lib "User32" (ByVal wFormat As LongPtr) As LongPtr
                Private Declare PtrSafe Function SetClipboardData Lib "User32" (ByVal wFormat As LongPtr, ByVal hMem As LongPtr) As LongPtr
                Private Declare PtrSafe Function GlobalAlloc Lib "kernel32.dll" (ByVal wFlags As Long, ByVal dwBytes As Long) As LongPtr
                Private Declare PtrSafe Function GlobalLock Lib "kernel32.dll" (ByVal hMem As LongPtr) As LongPtr
                Private Declare PtrSafe Function GlobalUnlock Lib "kernel32.dll" (ByVal hMem As LongPtr) As LongPtr
                Private Declare PtrSafe Function GlobalSize Lib "kernel32" (ByVal hMem As LongPtr) As Long
                Private Declare PtrSafe Function lstrcpy Lib "kernel32.dll" Alias "lstrcpyW" (ByVal lpString1 As Any, ByVal lpString2 As Any) As LongPtr
            #Else
                Private Declare Function OpenClipboard Lib "user32.dll" (ByVal hWnd As Long) As Long
                Private Declare Function EmptyClipboard Lib "user32.dll" () As Long
                Private Declare Function CloseClipboard Lib "user32.dll" () As Long
                Private Declare Function IsClipboardFormatAvailable Lib "user32.dll" (ByVal wFormat As Long) As Long
                Private Declare Function GetClipboardData Lib "user32.dll" (ByVal wFormat As Long) As Long
                Private Declare Function SetClipboardData Lib "user32.dll" (ByVal wFormat As Long, ByVal hMem As Long) As Long
                Private Declare Function GlobalAlloc Lib "kernel32.dll" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
                Private Declare Function GlobalLock Lib "kernel32.dll" (ByVal hMem As Long) As Long
                Private Declare Function GlobalUnlock Lib "kernel32.dll" (ByVal hMem As Long) As Long
                Private Declare Function GlobalSize Lib "kernel32" (ByVal hMem As Long) As Long
                Private Declare Function lstrcpy Lib "kernel32.dll" Alias "lstrcpyW" (ByVal lpString1 As Long, ByVal lpString2 As Long) As Long
            #End If
            
            Public Sub SetClipboard(sUniText As String)
                #If VBA7 Then
                    Dim iStrPtr As LongPtr
                    Dim iLock As LongPtr
                #Else
                    Dim iStrPtr As Long
                    Dim iLock As Long
                #End If
                Dim iLen As Long
                Const GMEM_MOVEABLE As Long = &H2
                Const GMEM_ZEROINIT As Long = &H40
                Const CF_UNICODETEXT As Long = &HD
                OpenClipboard 0&
                EmptyClipboard
                iLen = LenB(sUniText) + 2&
                iStrPtr = GlobalAlloc(GMEM_MOVEABLE Or GMEM_ZEROINIT, iLen)
                iLock = GlobalLock(iStrPtr)
                lstrcpy iLock, StrPtr(sUniText)
                GlobalUnlock iStrPtr
                SetClipboardData CF_UNICODETEXT, iStrPtr
                CloseClipboard
            End Sub
            
            Public Function GetClipboard() As String
            #If VBA7 Then
                Dim iStrPtr As LongPtr
                Dim iLock As LongPtr
            #Else
                Dim iStrPtr As Long
                Dim iLock As Long
            #End If
                Dim iLen As Long
                Dim sUniText As String
                Const CF_UNICODETEXT As Long = 13&
                OpenClipboard 0&
                If IsClipboardFormatAvailable(CF_UNICODETEXT) Then
                    iStrPtr = GetClipboardData(CF_UNICODETEXT)
                    If iStrPtr Then
                        iLock = GlobalLock(iStrPtr)
                        iLen = GlobalSize(iStrPtr)
                        sUniText = String$(iLen \ 2& - 1&, vbNullChar)
                        lstrcpy StrPtr(sUniText), iLock
                        GlobalUnlock iStrPtr
                    End If
                    GetClipboard = sUniText
                End If
                CloseClipboard
            End Function
            

            我希望它可以帮助其他人,就像它帮助了我一样。

            【讨论】:

              【解决方案15】:

              更简单的方法:
              首先粘贴到新电子邮件草稿中 - 不会包含任何引号。
              Ctrl-A 并从那里再次复制,丢弃草稿电子邮件。

              【讨论】:

                猜你喜欢
                • 2020-07-28
                • 2013-12-07
                • 2017-09-19
                • 2017-07-15
                • 2019-04-28
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2022-08-14
                相关资源
                最近更新 更多