Оставьте кавычки при копировании из ячейки
Проблема:
При копировании ячейки из 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), решил проблему.