从单元格复制时,请不要使用引号
问题 :
在程序外复制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)”创build的选项卡保留,这是很好的。
"1 SOME NOTES FOR LINE 1. 2 SOME NOTES FOR LINE 2."
当我复制到另一个程序时,怎样才能让这些双引号出现 ? 换句话说,当单元格被复制到剪贴板时,我可以保持它们不被自动添加吗?
如果您尝试粘贴到Word-Pad,Notepad ++或Word中,则不会出现此问题。 要将单元格的值复制为纯文本,要实现所描述的必须使用macros:
在要应用此工作簿的工作簿中(或者如果要在多个工作簿中使用,请在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,然后在左上方的“项目窗口”中右键单击工作簿,然后select“插入”>“模块”。 将代码粘贴到将在右侧打开的代码模块窗口中。
回到Excel中,进入工具>macros>macros,select名为“CopyCellContents”的macros,然后从对话框中select选项。 在这里你可以把macros指定给一个快捷键(例如CTRL + C用于正常拷贝) – 我使用了CTRL + Q。
然后,当你想复制一个单元格到记事本/任何地方,只要按Ctrl + q(或任何你select的),然后做一个CTRL + V或编辑>粘贴在你select的目的地。
我的答案被复制(有几个补充): 这里
编辑 :(从评论)
如果在引用列表中找不到Microsoft Forms 2.0库,则可以尝试
- 寻找FM20.DLL而不是(谢谢@Peter Smallwood)
- 单击浏览并select
C:\Windows\System32\FM20.dll
(32位Windows)(谢谢@JWhy) - 单击浏览并select
C:\Windows\SysWOW64\FM20.dll
(在64位上)
我刚刚遇到了这个问题,并用CLEAN函数为每个单元格包装了我。 这应该是相对容易的做“= CLEAN(”,select你的单元格,然后自动填充列的其余部分。这样做后,粘贴到记事本或任何其他程序不再有重复的引号。
首先将其粘贴到Word中,然后将其粘贴到记事本中,并且不显示引号
如果你想select多个单元格,并把它们的值复制到剪贴板,而没有所有这些恼人的引号,下面的代码可能是有用的。 这是来自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
当我遇到报价问题时,我的解决scheme是从我的单元格文本的末尾去掉回车符。 由于这些回车(由外部程序插入),Excel正在为整个string添加引号。
与“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中的一个单元格中,我得到两个符号组成的正方形,里面有一个问号,如下所示:⍰⍰。 粘贴到记事本甚至不显示任何东西。
解:
经过一段时间的search后,我发现了另外一个使用Windows API的用户“Nepumuk”的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
并通过Excelmacros菜单运行它,如从“user3616725”从接受的答案build议:
回到Excel中,进入工具>macros>macros,select名为“CopyCellContents”的macros,然后从对话框中select选项。 在这里,您可以将macros指定给一个快捷键(例如Ctrl + c用于正常复制) – 我使用Ctrl + q。
然后,当你想将单个单元格复制到记事本/任何地方时,只需按Ctrl + q(或任何你select的),然后在你select的目的地执行Ctrl + V或编辑>粘贴。
编辑(2015年11月21日):
@来自“dotter”的评论:
不,这个真的不是新的问题! 在我看来,这是一个很好的补充接受的答案,因为我的答案解决了使用接受答案中的代码时可能面临的问题。 如果我有更多的声誉,我会创build一个评论。
@来自“Teepeemm”的评论:
是的,你是对的,从标题“问题:”开始的答案是误导。 更改为:“与来自”user3616725“的答案有关的可能的问题:”。 作为一个评论,我当然会写得更紧凑。
为了在粘贴记事本时保持换行,在macros中replace这一行:
strTemp = ActiveCell.Value
通过:
strTemp = Replace(ActiveCell.Value, Chr(10), vbCrLf)
请使用下面的公式
=Clean("1"&CHAR(9)&"SOME NOTES FOR LINE 1."&CHAR(9)&"2"&CHAR(9)&"SOME NOTES FOR LINE 2.")
你会得到你想要的;-)