Залишайте лапки при копіюванні з комірки


90

Проблема :
Під час копіювання комірки з 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, на жаль, мені потрібно, щоб це працювало точно так, як я тут написав, за винятком провідних і кінцевих подвійних лапок. Будь ласка, не дозволяйте вкладкам відводити фокус цього питання - вони повинні бути там.
Аарон Томас

Відповіді:


28

Якщо ви спробуєте вставити в 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-розрядної версії)

1
Схоже, VBA - єдине рішення цього - дякую за введені дані.
Аарон Томас

1
Якщо ви не можете побачити бібліотеку Microsoft Forms у списку посилань, перегляньте FM20.DLL
Peter Smallwood

15
Я все ще отримую лапки, якщо вставляю їх у Notepad ++.
Кет

1
@monkeyintern Я думаю, у мене було кілька рядків тексту в одній комірці, і, розділивши їх на один рядок на клітинку, я міг обійти це.
Кет

2
@ user3616725 Оновлені версії, можливо, змінили цю поведінку, але поточні версії Word та Notepad ++ (станом на дату публікації цього коментаря) вставляють ці лапки при виборі однієї чи декількох комірок.
Тоні,

80

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


20
Хороша відповідь для стирання зайвих лапок, але, на жаль, це також стирає символи табуляції ... які, у питанні, я хочу зберегти. Дякую за вступ!
Аарон Томас

Це працювало для мене, я не дбав про вкладки - насправді я хотів, щоб їх усі і символи нового рядка все одно видалили.
Коді

19
Він видаляє всі символи ASCII нижче 32. Тож і нові рядки.
NeplatnyUdaj

1
Це справжня відповідь.
Тайлер Муррі,

10
Це не найкраще рішення, оскільки воно видаляє всі спеціальні символи.
Павло

25

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


Дякую за вступ, але я не можу позначити це як гарне рішення. Плюс це дублікат рішення, яке вже було запропоновано для цього питання, див. Stackoverflow.com/a/24913557/2658159 .
Аарон Томас,

4
Дякую, мені сподобалось це рішення. Швидко і легко
Баджал

Проголосувавши за це ... у моєму випадку моя проблема полягала в тому, що для певного типу запиту, який я отримую, дані надходять у файл Excel, і мені потрібно вставити їх у звичайне текстове поле. Коли я це роблю, я отримую цитати. Я використовував текстовий редактор для видалення зайвих лапок (він також цитував цитати .. дратує!). Шукаючи просте рішення, я виявив, що вставка в Word спочатку працює, оскільки зайві лапки зникли. Бажаю, щоб я міг підтримати цей 10-кратний :)
Карнікс,

Це видалить символи табуляції. Принаймні, коли використовуєш слово, не впевнений щодо wordpad
Matthew Lueder

Це найкраще рішення навіть на сьогодні.
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)) після кожного рядка. ПРИМІТКА. Ви все одно не зможете скопіювати символи, вбудовані в комірку, що призведе до виходу з цільового поля, в яке ви вставляєте цю комірку (тобто Tab або CR під час вставлення у вікно редагування таблиці доступу або SSMS).
Том,

^ Також виправлено помилку компілятора "Змінна не визначена" (для змінної "CR").
Том,

4

Моє рішення, коли я потрапив у питання про лапки, було позбавити повернення каретки з кінця тексту моїх комірок. Через ці повернення каретки (вставлені зовнішньою програмою) Excel додавав лапки до всього рядка.


4
Котирування також можуть бути результатом CR / LF всередині формули (не обов'язково в кінці), або вкладкою, як у вихідному питанні цієї теми (char (9)).
Турбо

ти справді полегшив мені життя
dE Джерело

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", який використовує API Windows . Ось його код, який нарешті спрацював для мене:

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 зверху, змініть підпункт "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> Paste у вибраному вами місці призначення.


Редагувати (21 листопада 2015 р.):
@ Коментар від "dotctor":
Ні, це серйозно не нове питання! На мою думку, це гарне доповнення до прийнятої відповіді, оскільки моя відповідь стосується проблем, з якими ви можете зіткнутися, використовуючи код прийнятої відповіді. Якби у мене було більше репутації, я б створив коментар.
@ коментар від "Teepeemm":
Так, ви маєте рацію, відповіді, що починаються з назви "Проблема:", вводять в оману. Змінено на: "Можлива проблема щодо відповіді від" user3616725 ":". Як коментар я, звичайно, написав би набагато компактніше.


Я думаю, що це працює як вірна відповідь (хоча відкриття програми Проблема здавалося, що у вас нова проблема). А коментарі обмежуються 600 символами, тому це однозначно було б занадто довгим для цього.
Teepeemm

Чудово! Дякую! Здається, єдина проблема полягає в тому, що вона працює лише для однієї комірки. Чи можна це якось вдосконалити, щоб дозволити діапазони копіювання?
NeplatnyUdaj

3

"Якщо ви хочете вибрати кілька клітинок і скопіювати їх значення в буфер обміну без усіх цих надокучливих лапок" ( без помилок у рішенні Пітера Смолвуда з декількох комірок), "наступний код може бути корисним." Це вдосконалення коду, наведеного вище від Пітера Смолвуда (що "є вдосконаленням коду, наведеного вище від користувача 3616725"). Це виправляє такі помилки у рішенні Пітера Смолвуда:

  • Уникає "Змінна не визначена" Помилка компілятора (для "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)

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

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 також
зачищає
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.