Leave out quotes when copying from cell

后端 未结 13 920
情话喂你
情话喂你 2020-12-01 04:16

Problem:
When copying a cell from Excel outside of the program, double-quotes are added automatically.

Details:
I\'m using

相关标签:
13条回答
  • 2020-12-01 04:44

    You can do this in an Excel macro via VBA, sending the results to a file:

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

    And if you are wanting to get filenames and content into multiple files, here is a short snippet that avoids the double quotes around the output.

    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 讨论(0)
  • 2020-12-01 04:47

    First paste it into Word, then you can paste it into notepad and it will appear without the quotes

    0 讨论(0)
  • 2020-12-01 04:49

    Possible problem in relation to answer from "user3616725":
    Im on Windows 8.1 and there seems to be a problem with the linked VBA code from accepted answer from "user3616725":

    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
    

    Details:
    Running above code and pasting clipboard into a cell in Excel I get two symbols composed of squares with a question mark inside, like this: ⍰⍰. Pasting into Notepad doesn't even show anything.

    Solution:
    After searching for quite some time I found another VBA script from user "Nepumuk" which makes use of the Windows API. Here's his code that finally worked for me:

    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
    

    To use it the same way like the first VBA code from above, change the Sub "Beispiel()" from:

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

    To:

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

    And run it via Excel macro menu like suggested from "user3616725" from accepted answer:

    Back in Excel, go Tools>Macro>Macros and select the macro called "CopyCellContents" and then choose Options from the dialog. Here you can assign the macro to a shortcut key (eg like Ctrl+c for normal copy) - I used Ctrl+q.

    Then, when you want to copy a single cell over to Notepad/wherever, just do Ctrl+q (or whatever you chose) and then do a Ctrl+v or Edit>Paste in your chosen destination.


    Edit (21st of November in 2015):
    @ comment from "dotctor":
    No, this seriously is no new question! In my opinion it is a good addition for the accepted answer as my answer addresses problems that you can face when using the code from the accepted answer. If I would have more reputation, I would have created a comment.
    @ comment from "Teepeemm":
    Yes, you are right, answers beginning with title "Problem:" are misleading. Changed to: "Possible problem in relation to answer from "user3616725":". As a comment I certainly would have written much more compact.

    0 讨论(0)
  • 2020-12-01 04:49

    "If you want to Select multiple Cells and Copy their values to the Clipboard without all those annoying quotes" (without the bugs in Peter Smallwood's multi-Cells solution) "the following code may be useful." This is an enhancement of the code given above from Peter Smallwood (which "is an enhancement of the code given above from user3616725"). This fixes the following bugs in Peter Smallwood's solution:

    • Avoids "Variable not defined" Compiler Error (for "CR" - "clibboardFieldDelimiter " here)
    • Convert an Empty Cell to an empty String vs. "0".
    • Append Tab (ASCII 9) vs. CR (ASCII 13) after each Cell.
    • Append a CR (ASCII 13) + LF (ASCII 10) (vs. CR (ASCII 13)) after each Row.

    NOTE: You still won't be able to copy characters embedded within a Cell that would cause an exit of the target field you're Pasting that Cell into (i.e. Tab or CR when Pasting into the Edit Table Window of Access or 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
    
    0 讨论(0)
  • 2020-12-01 04:49

    Please use the below formula

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

    and you will get what you want ;-)

    0 讨论(0)
  • 2020-12-01 04:50

    If you want to select multiple cells and copy their values to the clipboard without all those annoying quotes the following code may be useful. This is an enhancement of the code given above from 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
    
    0 讨论(0)
提交回复
热议问题