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

95

Проблема :
при копировании ячейки из 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."

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

Аарон Томас
источник
Вы пробовали изменить формат на другой, кроме числа? Я думаю, что видел способы обойти это, но я не могу открыть Excel именно в этот момент, я вернусь через несколько минут, если все еще не будет ответа.
AdamMc331
@ McAdam331 в моей настройке, если формат похож на текст, ячейка отображает формулу, а не результат вычисления. Кажется, что форматирование как число по какой-то причине отменяет это.
Аарон Томас
Почему вы выбрали формулу? Это потому, что Excel не поддерживает простой способ вставки символов табуляции? Кажется, я тоже не могу обойти это, возможно, есть другие варианты, кроме Excel, которые вы можете использовать, но я не уверен, каков характер проекта.
AdamMc331
Кроме того, это может быть проблемой, но если вы откроете Excel и начнете вводить текст в ячейке (которая по умолчанию отформатирована как Общий) и вы введете текст, он будет скопирован без кавычек. (Проверено с использованием Excel 2013 и Notepad ++) Повлияет ли на ваш проект ввод 4 пробелов вместо табуляции? Опять же, сложно сказать, не зная остальной проблемы.
AdamMc331
1
@ McAdam331, к сожалению, мне нужно, чтобы это работало именно так, как я здесь указал, за исключением ведущих и завершающих двойных кавычек. Пожалуйста, не позволяйте вкладкам отвлекать внимание от этого вопроса - они должны быть там.
Аарон Томас,

Ответы:

33

Если вы попытаетесь вставить в 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или Правка> Вставить в выбранное место назначения.

Мой ответ скопирован (с некоторыми дополнениями) отсюда

РЕДАКТИРОВАТЬ : (из комментариев)

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

  • вместо этого ищу FM20.DLL (спасибо @Peter Smallwood)
  • нажав Обзор и выбрав C:\Windows\System32\FM20.dll(32-битная Windows) (спасибо @JWhy)
  • нажав Обзор и выбрав C:\Windows\SysWOW64\FM20.dll (в 64-битной версии)
user3616725
источник
1
Похоже, что VBA - единственное решение этой проблемы - спасибо за ввод.
Аарон Томас
1
Если вы не видите библиотеку Microsoft Forms lib в списке ссылок, найдите FM20.DLL
Питер Смоллвуд,
15
Я все равно получаю кавычки, если вставляю в Notepad ++.
Кэт
1
@monkeyintern Я думаю, что у меня было несколько строк текста в одной ячейке, и разделение их на одну строку на ячейку позволило мне обойти это.
Kat
2
@ user3616725 Обновленные версии могли изменить это поведение, но текущие версии Word и Notepad ++ (по состоянию на дату публикации этого комментария) вставляют эти кавычки при выборе одной или нескольких ячеек.
Тони
84

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

Грег Смалтер
источник
22
Хороший ответ для удаления лишних кавычек, но, к сожалению, он также стирает символы табуляции ... которые в вопросе я хочу сохранить. Спасибо за вклад!
Аарон Томас,
Это сработало для меня, меня не волновали вкладки - на самом деле я все равно хотел, чтобы все они и символы новой строки были удалены.
Коди
19
Он удаляет все символы ASCII ниже 32. Также новые строки.
NeplatnyUdaj
1
Это настоящий ответ.
Тайлер Мерри
11
Это не лучшее решение, так как оно удаляет все специальные символы.
Пол
26

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

Джонатан Уилсон
источник
Спасибо за вклад, но я не могу отметить это как хорошее решение. Кроме того, это дубликат решения, которое уже предлагалось по этому вопросу, см. Stackoverflow.com/a/24913557/2658159 .
Аарон Томас,
4
Спасибо, мне понравилось это решение. Быстро и легко
Bajal 06
Поддерживая этот ... в моем случае моя проблема заключалась в том, что для определенного типа запроса, который я получаю, данные поступают в файл Excel, и мне нужно вставить его в обычное текстовое поле. Когда я это делаю, я получаю цитаты. Я использовал текстовый редактор, чтобы удалить лишние кавычки (он тоже цитировал цитаты ... раздражает!). В поисках простого решения я обнаружил, что сначала работает вставка в Word, поскольку лишние кавычки исчезли. Хотел бы я проголосовать за это 10x :)
Carnix
Это удалит символы табуляции. По крайней мере, когда использую слово, не уверен в блокноте
Мэтью Людер,
Это лучшее решение даже на сегодняшний день.
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) (вместо CR (ASCII 13)) после каждой строки. ПРИМЕЧАНИЕ. Вы по-прежнему не сможете копировать символы, встроенные в ячейку, которые могут вызвать выход из целевого поля, в которое вы вставляете эту ячейку (например, вкладка или CR при вставке в окно редактирования таблицы доступа или SSMS).
Tom
^ Также исправляет ошибку компилятора «Переменная не определена» (для переменной «CR»).
Tom
4

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

мартиангоблин
источник
4
Цитаты также могут быть результатом CR / LF внутри формулы (не обязательно в конце) или вкладкой, как в исходном вопросе этой цепочки (char (9)).
Turbo
Вы действительно облегчили мне жизнь
dE Source
3

Возможная проблема в связи с ответом от "user3616725":
Я использую 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 от пользователя «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

Кому:

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

И запустите его через меню макросов Excel, как это было предложено пользователем 3616725 из принятого ответа:

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

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


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

SourceSeeker
источник
Я думаю, что это работает как правильный ответ (хотя при открытии с помощью Problem создается впечатление, что у вас возникла новая проблема). И комментарии ограничены 600 символами, так что это определенно будет слишком длинным для этого.
Teepeemm
Замечательный! Благодаря! Единственная проблема, похоже, в том, что это работает только для одной ячейки. Можно ли как-то улучшить, чтобы можно было копировать диапазоны?
NeplatnyUdaj
3

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

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

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

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

strTemp = ActiveCell.Value

по:

strTemp = Replace(ActiveCell.Value, Chr(10), vbCrLf)
JCP
источник
0

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

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

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

Стефан Шиве
источник
2
Это помогает, но удаляет мое форматирование (новые строки и вкладки)
Gabriel G
0

Вы можете сделать это в макросе 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'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
JoshInDC
источник
0
  • если формула имеет несколько строк (означает, что в формуле есть разрыв строки), то копипаст будет работать таким образом
  • если можно удалить несколько строк, то при копировании и вставке кавычки не появятся.
  • иначе используйте функцию CLEAN, как сказал @greg в предыдущем ответе
виньеш
источник
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