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

10 ответов


Если вы попытаетесь вставить в Word-Pad, Notepad++ или Word, у вас не будет этой проблемы. Чтобы скопировать значение ячейки как чистый текст, для достижения того, что вы описываете, вы должны использовать макрос:

в книге, где вы хотите, чтобы это применялось (или в вашем личном.формате 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 > вставить в выбранном месте назначения.

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

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

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

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

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


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


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


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

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

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


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


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

strTemp = ActiveCell.Value

by:

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

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


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

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

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


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

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

Примечание: Вы все равно не сможете скопировать символы, встроенные в ячейку, что приведет к выходу целевое поле, в которое вы вставляете эту ячейку (например, Tab или CR при вставке в окно редактирования таблицы Access или 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