Оставьте кавычки при копировании из ячейки

Проблема:
При копировании ячейки из Excel за пределы программы автоматически добавляются двойные кавычки.

Подробнее:
Я использую Excel 2007 на компьютере под управлением Windows 7. Если у меня есть ячейка со следующей формулой:

="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."

Как я могу сохранить эти двойные кавычки,, когда я копирую в другую программу? Другими словами, могу ли я сохранить их от автоматического добавления, когда ячейка скопирована в буфер обмена?

Ответ 1

Если вы попробуете вставить в 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

Чтобы добавить стандартный модуль в свой проект (рабочую книгу), откройте VBE с помощью Alt + F11, а затем щелкните правой кнопкой мыши на своей книге в верхнем левом окне проекта и выберите "Вставить" > "Модуль". Вставьте код в окно модуля кода, которое откроется справа.

Вернитесь в Excel, откройте "Инструменты" > "Макро" > "Макросы" и выберите макрос "CopyCellContents", а затем выберите "Параметры" в диалоговом окне. Здесь вы можете назначить макрос клавише быстрого доступа (например, как CTRL + C для обычной копии) - я использовал CTRL + Q.

Затем, когда вы хотите скопировать одну ячейку в блокнот/где угодно, просто сделайте Ctrl + q (или все, что вы выбрали), а затем выполните CTRL + V или Edit > Paste в выбранном вами месте назначения.

Мой ответ скопирован (с несколькими дополнениями) из: здесь

EDIT: (из комментариев)

Если вы не нашли библиотеку Microsoft Forms 2.0 в списке ссылок, Вы можете попробовать

  • ищет FM20.DLL вместо этого (спасибо @Peter Smallwood)
  • нажмите "Обзор" и выберите C:\Windows\System32\FM20.dll (32 бит Windows) (спасибо @JWhy)
  • нажмите "Обзор" и выберите C:\Windows\SysWOW64\FM20.dll (на 64-разрядной версии)

Ответ 2

У меня просто была эта проблема, и упаковка каждой ячейки с помощью функции CLEAN исправила ее для меня. Это должно быть относительно легко сделать, выполнив =CLEAN(, выбрав ячейку, а затем автозаполняя остальную часть столбца. После этого вставки в "Блокнот" или любую другую программу больше не имеют повторяющихся котировок.

Ответ 3

Сначала вставьте его в Word, затем вы можете вставить его в блокнот и он появится без кавычек

Ответ 4

Если вы хотите выбрать несколько ячеек и скопировать их значения в буфер обмена без всех этих раздражающих цитат, может оказаться полезным следующий код. Это усовершенствование приведенного выше кода от 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

Ответ 5

Мое решение, когда я попал в проблему с кавычками, состоял в том, чтобы удалить каретки с конца текста моей ячейки. Из-за этих возвратов каретки (вставленных внешней программой) Excel добавлял кавычки ко всей строке.

Ответ 6

Возможная проблема в отношении ответа от пользователя user3616725:
Im в Windows 8.1 и, похоже, проблема связана с связанным кодом VBA с принятым ответом от "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

Детали:
Выполняя над кодом и вставляя буфер обмена в ячейку в Excel, я получаю два символа, состоящих из квадратов с вопросительным знаком внутри, например: ⍰⍰. Вставка в Блокнот даже не показывает ничего.

Решение:
После довольно долгого поиска я нашел другой VBA script от пользователя "Nepumuk" , который использует Windows API. Вот его код, который, наконец, работал у меня:

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

To:

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

И запустите его через меню макросов Excel, как предлагается из "user3616725" из принятого ответа:

Вернитесь в Excel, откройте "Инструменты" > "Макро" > "Макросы" и выберите макрос, называемый "CopyCellContents", а затем выберите "Параметры" в диалоговом окне. Вот ты может назначить макрос клавише быстрого доступа (например, например, Ctrl + c для нормального copy) - я использовал Ctrl + q.

Затем, когда вы хотите скопировать одну ячейку в блокнот/где угодно, просто сделайте Ctrl + q (или все, что вы выбрали), а затем сделайте Ctrl + v или Правкa > Вставить в выбранное место назначения.


Изменить (21 ноября 2015 года):
@комментарий от "dotctor":
Нет, это серьезно не новый вопрос! По моему мнению, это хорошее дополнение для принятого ответа, так как мой ответ решает проблемы, с которыми вы можете столкнуться при использовании кода из принятого ответа. Если бы у меня была большая репутация, я бы создал комментарий.
@комментарий от "Teepeemm":
Да, вы правы, ответы, начинающиеся с заголовка "Проблема:", вводят в заблуждение. Изменено: "Возможная проблема в отношении ответа от пользователя user3616725": ". В качестве комментария я, конечно, написал бы гораздо более компактный.

Ответ 7

"Если вы хотите выбрать несколько ячеек и скопировать их значения в буфер обмена без всех этих раздражающих котировок" (без ошибок в решении нескольких ячеек Peter Smallwood), "следующий код может быть полезен". Это усовершенствование приведенного выше кода от Питера Смолвуда (который "является улучшением приведенного выше кода от user3616725"). Это устраняет следующие ошибки в решении Peter Smallwood:

  • Avoids "Variable not defined" Ошибка компилятора (для "CR" - "clibboardFieldDelimiter" здесь)
  • Преобразуйте пустую ячейку в пустую строку с "0".
  • Добавить вкладку (ASCII 9) по сравнению с CR (ASCII 13) после каждой ячейки.
  • После каждой строки добавьте CR (ASCII 13) + LF (ASCII 10) (по сравнению с CR (ASCII 13)).

ПРИМЕЧАНИЕ. Вы по-прежнему не сможете копировать символы, встроенные в ячейку, что приведет к выходу из целевого поля, в которое вы вставляете эту ячейку (например, Tab или CR при вставке в окно редактирования таблицы доступа или 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

Ответ 8

Чтобы сохранить разрывы строк при вставке в блокнот, замените эту строку макросом:

strTemp = ActiveCell.Value

по:

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

Ответ 9

Пожалуйста, используйте приведенную ниже формулу

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

и вы получите то, что хотите; -)

Ответ 10

Также можно удалить эти двойные кавычки, поставив свой результат на функцию "Очистить".

Пример: = CLEAN ("1" & CHAR (9) & "НЕКОТОРЫЕ ПРИМЕЧАНИЯ ДЛЯ ЛИНИИ 1." & CHAR (9) & "2" & CHAR (9) & "НЕКОТОРЫЕ ПРИМЕЧАНИЯ ДЛЯ ЛИНИИ 2.")

Выход будет вставлен без двойных кавычек в другие программы, такие как Notepad++.

Ответ 11

Вы можете сделать это в макросе Excel через VBA, отправив результаты в файл:

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 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

Ответ 12

Эта странная проблема произошла со мной, когда я поместил CHAR (9) в начало формулы: = +char (9) & "case" & char (34) & B195 & "txtAux =" "" & F195 & ":" & C195 & char (34 ) при копировании и вставке он дублировал все двойные кавычки "case 10 txtAux =" "Estado compresor: Parado" "" в Excel это показало, что case 10 txtAux = "Estado compresor: Parado", удаляющий char (9), решил проблему.