从单元格复制时,请保留引号


90

问题
在程序外部从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,如果仍然没有答案,我会在几分钟后回来。
AdamMc331

@ McAdam331在我的设置中,如果格式是类似于文本的格式,则该单元将显示公式,而不是计算结果。由于某些原因,格式化为数字似乎可以替代此设置。
亚伦·托马斯

您为什么选择使用公式?是因为Excel不支持插入制表符的简便方法吗?我似乎也无法解决此问题,也许可以使用Excel以外的其他选项,但是我不确定项目的性质是什么。
AdamMc331

同样,这可能很麻烦,但是如果您打开Excel并开始键入一个单元格(默认情况下,其格式设置为“常规”)并输入文本,则该文本将被复制而没有引号。(使用Excel 2013和Notepad ++测试)仅输入4个空格而不是制表符会影响您的项目吗?同样,在不了解其余问题的情况下很难说。
AdamMc331

1
不幸的是,@ McAdam331我需要它完全按照我在此处的说明工作,减去前导和尾随双引号。请不要让这些选项卡脱离此问题的重点-它们必须在那里。
亚伦·托马斯

Answers:


28

如果您尝试粘贴到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+ 打开VBE,F11然后在左上角的“项目”窗口中右键单击您的工作簿,然后选择“插入”>“模块”。将代码粘贴到将在右侧打开的代码模块窗口中。

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

然后,当您要将单个单元格复制到记事本/任意位置时,只需执行Ctrl + q(或选择的任何操作),然后在选定的目标位置执行CTRL+ V或Edit> Paste。

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

编辑:(来自评论)

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

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

1
看来VBA是唯一的解决方案-感谢您的输入。
亚伦·托马斯

1
如果您在引用列表中看不到Microsoft Forms库,则浏览FM20.DLL
Peter Smallwood

15
如果我粘贴到Notepad ++中,仍然可以得到报价。
Kat

1
@monkeyintern我想我在一个单元格中有多行文本,然后将它们分成每个单元格一行使我可以绕开它。

2
@ user3616725更新的版本可能已更改了此行为,但是在选择单个或多个单元格时,Word和Notepad ++的当前版本(截至此评论的发布日期)会粘贴这些引号。
托尼

80

我只是遇到了这个问题,并用CLEAN为我修复的函数包装了每个单元格。这样做是相对容易的,方法是:先=CLEAN(选择您的单元格,然后自动填充其余的列。完成此操作后,粘贴到记事本或任何其他程序中不再有重复的引号。


20
删除多余引号的好答案,但是不幸的是,它也删除了制表符...在这个问题上,我想保留。感谢您的输入!
亚伦·托马斯

这对我有用,我不在乎制表符-实际上,我希望将所有选项卡和换行符都删除。
科迪

19
它会删除所有低于32的ASCII字符。因此也要换行。
NeplatnyUdaj '16

1
这是真正的答案。
泰勒·穆里

10
这不是一个好的解决方案,因为它会删除所有特殊字符。
Paul

25

首先将其粘贴到Word中,然后将其粘贴到记事本中,它将不带引号出现


感谢您的输入,但是我不能将其标记为一个好的解决方案。另外,它是该问题已提供的解决方案的重复,请参见stackoverflow.com/a/24913557/2658159
亚伦·托马斯

4
谢谢,我喜欢这个解决方案。快速简便
Bajal'1

支持这一点...就我而言,我的问题是,对于我收到的一种特殊类型的请求,数据位于Excel文件中,因此我需要将其粘贴到纯文本框中。当我这样做时,我得到了报价。我已经使用文本编辑器删除了多余的引号(它也引用了引号..烦人!)。在寻找一个简单的解决方案时,我发现粘贴到Word的第一个方法是多余的引号消失了。希望我能对此10x
投票

这将删除制表符。至少在使用单词时,不确定写字板
Matthew Lueder

即使是今天,这也是最好的解决方案。
zygimantus

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

我认为这是迄今为止最好的答案。
posfan12

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

^还修复了“未定义变量”编译器错误(针对“ CR”变量)。
汤姆

4

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


4
引号也可以是公式内的CR / LF的结果(不一定在末尾),或者是该线程原始问题(char(9))中的制表符。
Turbo

您真的让我的生活变得轻松
dE来源

3

与“ 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中的单元格中,我得到两个符号,这些符号由带有问号的正方形组成,如下所示:⍰⍰。粘贴到记事本甚至不显示任何内容。

解决方案:
搜索一段时间后,我从用户“ Nepumuk”中找到了另一个使用Windows API的VBA脚本。这是他的代码最终对我有用:

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”的评论:
是的,您是对的,以标题“ Problem:”开头的答案具有误导性。更改为:“与“ user3616725”的答案有关的可能问题:”。作为评论,我当然会写得更紧凑。


我认为这是一个有效的答案(尽管以“ 问题”开头似乎您遇到了一个新问题)。而且注释的上限为600个字符,因此,这样做肯定太长了。
Teepeemm 2015年

精彩!谢谢!唯一的问题似乎是它仅适用于单个单元格。可以以某种方式进行改进以允许复制范围吗?
NeplatnyUdaj '16

3

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

  • 避免出现“未定义变量”的编译器错误(此处为“ CR”-“ clibboardFieldDelimiter”)
  • 将一个空单元格转换为一个空字符串与“ 0”。
  • 在每个单元格后附加选项卡(ASCII 9)与CR(ASCII 13)。
  • 在每行之后附加一个CR(ASCII 13)+ LF(ASCII 10)(vs. 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

0

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

strTemp = ActiveCell.Value

通过:

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

0

请使用以下公式

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

你会得到你想要的;-)


2
这可以解决问题,但会删除我的格式设置(新行和标签)
Gabriel G

0

您可以通过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

而且,如果您希望将文件名和内容分成多个文件,这是一个简短的代码段,可以避免在输出中使用双引号。

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

0
  • 如果公式具有多行(公式中有换行符),则复制粘贴将以这种方式工作
  • 如果可以删除多行,则在复制粘贴时不会出现引号。
  • 否则使用@greg在先前答案中所说的CLEAN函数

0

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

因此,另一种方法,尤其是在OP由于制表符/换行符是由公式引起的情况下,是对制表符和硬返回使用替代字符。我将ascii Unit Separator = char(31)用于选项卡,将ascii Record Separator = char(30)用于新行。

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

如果选项卡/换行符已嵌入数据中,则可以进行搜索并替换为excel以将其转换。

无论使用公式还是更改数据,选择定界符的关键都决不要使用实际数据中可能存在的字符。这就是为什么我建议使用低级的ASCII字符的原因。


-1

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

例:

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

在其他程序(例如Notepad ++)上,输出将被粘贴而没有双引号。


这是重复的答案。CLEAN还删除换行符,制表符等
删除 posfan12
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.