Excel 从单元格复制时,请省略引号
问题:Excel 从单元格复制时,请省略引号,excel,clipboard,Excel,Clipboard,问题: 在程序外部从Excel复制单元格时,会自动添加双引号 详细信息: 我正在Windows7计算机上使用Excel2007。如果我有一个具有以下公式的单元格: ="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 NOTE
在程序外部从Excel复制单元格时,会自动添加双引号 详细信息:
我正在Windows7计算机上使用Excel2007。如果我有一个具有以下公式的单元格:
="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."
当我复制到另一个程序时,如何防止这些双引号出现?换句话说,当单元格复制到剪贴板时,我是否可以防止自动添加这些单元格?如果尝试粘贴到Word Pad、Notepad++或Word中,则不会出现此问题。 要将单元格值复制为纯文本,要实现所描述的内容,必须使用宏: 在要应用此功能的工作簿中(如果要跨多个工作簿使用,请在Personal.xls中),将以下代码放入标准模块中: 代码: 若要将标准模块添加到项目(工作簿),请使用Alt+F11打开VBE,然后在左上角的项目窗口中右键单击工作簿,然后选择“插入”>“模块”。将代码粘贴到右侧打开的代码模块窗口中 返回Excel,转到工具>宏>宏,选择名为“CopyCellContents”的宏,然后从对话框中选择选项。在这里,您可以将宏指定给快捷键(如CTRL+C用于普通复制)-我使用了CTRL+Q 然后,当您想将单个单元格复制到记事本/任何位置时,只需执行Ctrl+q(或您选择的任何操作),然后在您选择的目标位置执行Ctrl+V或Edit>Paste 我的答案(加上一些补充)抄袭自: 编辑(来自评论) 如果在“引用”列表中找不到Microsoft Forms 2.0库, 你可以试试
- 改为寻找FM20.DLL(谢谢@Peter Smallwood)
- 单击浏览并选择
(32位 (谢谢@JWhy)C:\Windows\System32\FM20.dll
- 单击浏览并选择
(在64位上)C:\Windows\SysWOW64\FM20.dll
CLEAN
函数包装每个单元格,为我解决了这个问题。通过执行=CLEAN,这应该相对容易做到(
,选择您的单元格,然后自动填充列的其余部分。完成此操作后,粘贴到记事本或任何其他程序中不再有重复的引号。首先将其粘贴到Word中,然后您可以将其粘贴到记事本中,它将显示为不带引号。要在粘贴到记事本时保持换行,请在m中替换这一行acro:
strTemp = ActiveCell.Value
作者:
与“用户3616725”的回答相关的可能问题:
Windows 8.1上的Im,从“user3616725”接受的答案中链接的VBA代码似乎有问题: 详细信息:
运行上面的代码并将剪贴板粘贴到Excel中的一个单元格中,我得到两个由正方形组成的符号,其中有一个问号,如下所示:⍰⍰. 粘贴到记事本上甚至不会显示任何内容 解决方案:
经过一段时间的搜索,我找到了。以下是他的代码,最终对我有用:
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代码一样使用它,请将子“Beispiel()”更改为:
致:
并通过Excel宏菜单运行,如接受答案中“user3616725”的建议:
返回Excel,转到工具>宏>宏,然后选择名为
“CopyCellContents”,然后从对话框中选择选项
可以将宏指定给快捷键(如Ctrl+c表示普通
复制)-我使用Ctrl+q
然后,当您要将单个单元格复制到记事本/任何位置时,
只需执行Ctrl+q(或您选择的任何操作),然后执行Ctrl+v或
编辑>粘贴到您选择的目的地
编辑(2015年11月21日):
@来自“dotctor”的评论:
不,这不是什么新问题!在我看来,这是对公认答案的一个很好的补充,因为我的答案解决了您在使用公认答案中的代码时可能遇到的问题。如果我有更多的声誉,我会发表评论。
@来自“Teepeemm”的评论:
是的,你是对的,以标题“问题:”开头的答案是误导性的。改为:“与“user3616725”的答案相关的可能问题”:。作为评论,我当然会写得更简洁。请使用以下公式
=Clean("1"&CHAR(9)&"SOME NOTES FOR LINE 1."&CHAR(9)&"2"&CHAR(9)&"SOME NOTES FOR LINE 2.")
你会得到你想要的;-)如果你想选择多个单元格,并将它们的值复制到剪贴板上,而不使用那些讨厌的引号,下面的代码可能会很有用。这是上面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
当我遇到引号问题时,我的解决方案是从单元格文本的末尾去掉回车符。由于这些回车符(由外部程序插入),Excel将向整个字符串添加引号。也可以通过将结果放在“Clean”函数上来删除这些双引号 例如:
=CLEAN("1"&CHAR(9)&"SOME NOTES FOR LINE 1."&CHAR(9)&"2"&CHAR(9)&"SOME NOTES FOR LINE 2.")
输出将在其他程序(如记事本++)上粘贴,不带双引号。“如果您想选择多个单元格,并将其值复制到剪贴板,而不带所有那些讨厌的引号”(不带彼得·斯莫尔伍德的多单元格解决方案中的bug),“以下代码可能会有用。”这是Peter Smallwood对上述代码的增强(这是“对上述user3616725代码的增强”)。这修复了Peter Smallwood解决方案中的以下错误:
- 避免“变量未定义”编译器错误(此处为“CR”-“clibboardFieldDelimiter”)
- 将空单元格转换为空字符串而不是“0”
- 附加T
Public Sub Beispiel() Call StringToClipboard("Hallo ...") End Sub
Sub CopyCellContents() Call StringToClipboard(ActiveCell.Value) End Sub
=Clean("1"&CHAR(9)&"SOME NOTES FOR LINE 1."&CHAR(9)&"2"&CHAR(9)&"SOME NOTES FOR LINE 2.")
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
=CLEAN("1"&CHAR(9)&"SOME NOTES FOR LINE 1."&CHAR(9)&"2"&CHAR(9)&"SOME NOTES FOR LINE 2.")
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
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
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
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