从单元格复制时省略引号

Aar*_*mas 81 excel clipboard

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

详细信息:
我在Windows 7计算机上使用Excel 2007.如果我有一个包含以下公式的单元格:

="1"&CHAR(9)&"SOME NOTES FOR LINE 1."&CHAR(9)&"2"&CHAR(9)&"SOME NOTES FOR LINE 2."
Run Code Online (Sandbox Code Playgroud)

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

1SOME NOTES FOR LINE 1.2SOME NOTES FOR LINE 2.
Run Code Online (Sandbox Code Playgroud)

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

"1  SOME NOTES FOR LINE 1.  2     SOME NOTES FOR LINE 2."
Run Code Online (Sandbox Code Playgroud)

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

Gre*_*ter 71

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

  • 删除额外报价的好答案,但遗憾的是它也会删除标签字符......在问题中,我想要保留.谢谢你的输入! (16认同)
  • 它删除32以下的所有ASCII字符.所以新行也是如此. (15认同)
  • 这不是一个好的解决方案,因为它删除了所有特殊字符. (5认同)
  • Downvoted,因为它从文本中删除换行符. (4认同)
  • 这才是真正的答案。 (2认同)

use*_*725 26

如果你尝试粘贴到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
Run Code Online (Sandbox Code Playgroud)

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

返回Excel,转到工具>宏>宏,然后选择名为"CopyCellContents"的宏,然后从对话框中选择选项.在这里你可以将宏分配给一个快捷键(例如像CTRL+ C正常拷贝) - 我用CTRL+ Q.

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

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

编辑 :(来自评论)

如果在引用列表中找不到Microsoft Forms 2.0 Library,则可以尝试

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

  • 如果我粘贴到Notepad ++中,我仍然会得到引号. (10认同)
  • @user3616725 更新版本可能改变了这种行为,但当前版本的 Word 和 Notepad++(截至本评论发布日期)在选择单个或多个单元格时粘贴这些引号。 (3认同)

小智 23

首先将其粘贴到Word中,然后将其粘贴到记事本中,它将显示没有引号

  • 谢谢,我喜欢这个解决方案.快捷方便 (4认同)

Pet*_*ood 6

如果要选择多个单元格并将其值复制到剪贴板而没有所有令人讨厌的引号,则以下代码可能有用.这是对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
Run Code Online (Sandbox Code Playgroud)

  • 请参阅基于此答案的“我的答案”,它可以解决以下错误:1.将一个空单元格转换为一个空字符串,而不是“ 0”。2.在每个单元格后附加制表符(ASCII 9)和CR(ASCII 13)。3.在每行之后附加一个CR(ASCII 13)+ LF(ASCII 10)(vs. CR(ASCII 13))。注意:您仍然无法复制嵌入单元格中的字符,这会导致您要将该单元格粘贴到的目标字段退出(即,粘贴到Access或SSMS的“编辑表”窗口时为Tab或CR)。 (2认同)

Tom*_*Tom 5

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

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

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


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
Run Code Online (Sandbox Code Playgroud)