Podczas kopiowania z komórki pomiń cytaty


90

Problem :
Podczas kopiowania komórki z Excela poza program, cudzysłowy są dodawane automatycznie.

Szczegóły :
używam programu Excel 2007 na komputerze z systemem Windows 7. Jeśli mam komórkę o następującej formule:

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

Dane wyjściowe w komórce (sformatowane jako liczba) wyglądają następująco w programie Excel:

1SOME NOTES FOR LINE 1.2SOME NOTES FOR LINE 2.

Dobrze i dobrze. Ale jeśli skopiuję komórkę do innego programu, takiego jak notatnik, dostaję irytujące podwójne cudzysłowy na początku i na końcu. Zauważ, że zakładki utworzone przez "CHAR (9)" są zachowane, co jest dobre.

"1  SOME NOTES FOR LINE 1.  2     SOME NOTES FOR LINE 2."

Jak mogę zapobiec wyświetlaniu tych podwójnych cudzysłowów podczas kopiowania do innego programu? Innymi słowy, czy mogę zapobiec automatycznemu dodawaniu ich, gdy komórka jest kopiowana do schowka?


Czy próbowałeś zmienić format na inny niż liczba? Wydaje mi się, że znalazłem sposoby na obejście tego problemu, ale nie mogę otworzyć programu Excel w tym momencie. Wrócę za kilka minut, jeśli nadal nie ma odpowiedzi.
AdamMc331

@ McAdam331 w mojej konfiguracji, jeśli format jest podobny do tekstu, komórka przenosi formułę, a nie obliczony wynik. Formatowanie jako liczba wydaje się z jakiegoś powodu zastępować to.
Aaron Thomas

Dlaczego zdecydowałeś się użyć wzoru? Czy to dlatego, że program Excel nie obsługuje łatwego sposobu wstawiania znaków tabulacji? Wydaje się, że nie mogę też tego obejść, być może istnieją opcje inne niż Excel, których możesz użyć, ale nie jestem pewien, jaki jest charakter tego projektu.
AdamMc331

Może to być również kłopotliwe, ale jeśli otworzysz program Excel i zaczniesz pisać w komórce (która jest domyślnie sformatowana jako Ogólne) i wprowadzisz tekst, zostanie on skopiowany bez cudzysłowów. (Testowane przy użyciu programu Excel 2013 i Notepad ++) Czy wprowadzenie 4 spacji zamiast tabulatora wpłynie na projekt? Ponownie, trudno powiedzieć, nie znając reszty problemu.
AdamMc331

1
@ McAdam331 niestety potrzebuję tego, aby działał dokładnie tak, jak tutaj umieściłem, bez wiodących i końcowych podwójnych cudzysłowów. Nie pozwól, aby zakładki odciągnęły od sedna tego pytania - muszą tam być.
Aaron Thomas

Odpowiedzi:


29

Jeśli spróbujesz wkleić do Word-Pad, Notepad ++ lub Word, nie miałbyś tego problemu. Aby skopiować wartość komórki jako czysty tekst, aby osiągnąć to, co opisujesz, musisz użyć makra:

W skoroszycie, w którym chcesz to zastosować (lub w pliku Personal.xls, jeśli chcesz używać w kilku skoroszytach), umieść następujący kod w standardowym module:

Kod:

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

Aby dodać standardowy moduł do projektu (skoroszytu), otwórz VBE za pomocą Alt+, F11a następnie kliknij prawym przyciskiem myszy skoroszyt w lewym górnym oknie projektu i wybierz Wstaw> Moduł. Wklej kod do okna modułu kodu, które otworzy się po prawej stronie.

Wróć do programu Excel, przejdź do Narzędzia> Makro> Makra i wybierz makro o nazwie „CopyCellContents”, a następnie wybierz Opcje z okna dialogowego. Tutaj możesz przypisać makro do klawisza skrótu (np. Jak CTRL+ Cdo normalnej kopii) - ja użyłem CTRL+ Q.

Następnie, gdy chcesz skopiować pojedynczą komórkę do Notatnika / gdziekolwiek, po prostu zrób Ctrl + q (lub cokolwiek wybierzesz), a następnie wykonaj CTRL+ Vlub Edycja> Wklej w wybranym miejscu docelowym.

Moja odpowiedź jest skopiowana (z kilkoma dodatkami) stąd: tutaj

EDYCJA : (z komentarzy)

Jeśli nie możesz znaleźć biblioteki Microsoft Forms 2.0 na liście odniesień, możesz spróbować

  • szukam zamiast tego FM20.DLL (dzięki @Peter Smallwood)
  • klikając Przeglądaj i wybierając C:\Windows\System32\FM20.dll(32-bitowe Windows) (dzięki @JWhy)
  • klikając Przeglądaj i wybierając C:\Windows\SysWOW64\FM20.dll (w wersji 64-bitowej)

1
Wygląda na to, że VBA jest jedynym rozwiązaniem tego problemu - dzięki za wkład.
Aaron Thomas

1
Jeśli nie widzisz biblioteki Microsoft Forms na liście odniesień, przejdź do pliku FM20.DLL
Peter Smallwood,

15
Nadal widzę cytaty, jeśli wkleię do Notepad ++.
Kat

1
@monkeyintern Myślę, że miałem wiele wierszy tekstu w jednej komórce i podzielenie ich na jedną linię na komórkę pozwoliło mi to obejść.
Kat

2
@ user3616725 Zaktualizowane wersje mogły zmienić to zachowanie, ale obecne wersje programów Word i Notepad ++ (na dzień opublikowania tego komentarza) wklejają te cudzysłowy, gdy zaznaczono jedną lub wiele komórek.
Tony

81

Właśnie miałem ten problem i owinięcie każdej komórki CLEANfunkcją naprawiło to za mnie. Powinno to być stosunkowo łatwe do zrobienia =CLEAN(, wybierając komórkę, a następnie automatycznie wypełniając resztę kolumny. Po tym, jak to zrobiłem, wklejanie do Notatnika lub innego programu nie zawierało już zduplikowanych cytatów.


20
Dobra odpowiedź na wymazanie dodatkowych cudzysłowów, ale niestety usuwa również znaki tabulacji ... które w pytaniu chcę zachować. W każdym razie dziękuję za wkład!
Aaron Thomas

To zadziałało dla mnie, nie przejmowałem się zakładkami - tak naprawdę chciałem je wszystkie i tak czy inaczej usunąć znaki nowej linii.
Cody

19
Usuwa wszystkie znaki ASCII poniżej 32. A więc także nowe linie.
NeplatnyUdaj

1
To jest prawdziwa odpowiedź.
Tyler Murry

10
To nie jest dobre rozwiązanie, ponieważ usuwa wszystkie znaki specjalne.
Paul

26

Najpierw wklej go do programu Word, a następnie możesz wkleić go do notatnika, a pojawi się bez cudzysłowów


Dzięki za wkład, ale nie mogę oznaczyć tego jako dobrego rozwiązania. Ponadto jest to duplikat rozwiązania, które zostało już zaoferowane w przypadku tego pytania, patrz stackoverflow.com/a/24913557/2658159 .
Aaron Thomas

4
Dzięki, podobało mi się to rozwiązanie. Szybko i łatwo
Bajal

Głosując za tym ... w moim przypadku moim problemem było to, że dla określonego typu otrzymywanego żądania dane są w pliku Excel i muszę je wkleić w zwykłym polu tekstowym. Kiedy to robię, dostaję cytaty. Użyłem edytora tekstu, aby usunąć dodatkowe cytaty (cytował też cudzysłowy ... irytujące!). Szukając prostego rozwiązania, zauważyłem, że wklejenie do programu Word działa jako pierwsze, gdy zniknęły dodatkowe cytaty. Chciałbym móc zagłosować za tym 10x :)
Carnix

Spowoduje to usunięcie znaków tabulacji. Przynajmniej używając słowa, nie jestem pewien co do
wordpada

To najlepsze rozwiązanie nawet na dziś.
zygimantus

6

Jeśli chcesz zaznaczyć wiele komórek i skopiować ich wartości do schowka bez tych irytujących cytatów, przydatny może być następujący kod. Jest to rozszerzenie kodu podanego powyżej od użytkownika 3616725.

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

Myślę, że to najlepsza jak dotąd odpowiedź.
posfan12

2
Zobacz moją odpowiedź opartą na tej odpowiedzi, która naprawia następujące błędy: 1. Przekonwertuj pustą komórkę na pusty ciąg zamiast „0”. 2. Zakładka Append (ASCII 9) vs. CR (ASCII 13) po każdej komórce. 3. Dołącz CR (ASCII 13) + LF (ASCII 10) (w porównaniu z CR (ASCII 13)) po każdym wierszu. UWAGA: Nadal nie będzie można kopiować znaków osadzonych w komórce, które spowodowałyby wyjście z pola docelowego, do którego wklejasz tę komórkę (tj. Tab lub CR podczas wklejania do okna edycji tabeli dostępu lub SSMS).
Tom

^ Naprawia również błąd kompilatora „Zmienna niezdefiniowana” (dla zmiennej „CR”).
Tom

4

Moim rozwiązaniem, gdy trafiłem na problem z cudzysłowami, było usunięcie powrotów karetki z końca tekstu moich komórek. Z powodu tych powrotów karetki (wstawionych przez program zewnętrzny) Excel dodawał cudzysłowy do całego ciągu.


4
Cudzysłowy mogą być również wynikiem CR / LF wewnątrz formuły (niekoniecznie na końcu) lub tabulatora jak w oryginalnym pytaniu tego wątku (char (9)).
Turbo

naprawdę ułatwiłeś mi życie
dE Source,

3

Możliwy problem związany z odpowiedzią od „user3616725”: Używam
Windows 8.1 i wydaje się, że jest problem z połączonym kodem VBA z zaakceptowanej odpowiedzi od „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

Szczegóły:
Uruchamiając powyższy kod i wklejając schowek do komórki w Excelu, otrzymuję dwa symbole złożone z kwadratów ze znakiem zapytania w środku, tak: ⍰⍰. Wklejanie do Notatnika nawet niczego nie pokazuje.

Rozwiązanie:
Po dłuższych poszukiwaniach znalazłem inny skrypt VBA od użytkownika „Nepumuk”, który korzysta z Windows API . Oto jego kod, który w końcu zadziałał dla mnie:

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

Aby użyć go w taki sam sposób jak pierwszego kodu VBA z góry, zmień Sub „Beispiel ()” z:

Public Sub Beispiel()
    Call StringToClipboard("Hallo ...")
End Sub

Do:

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

I uruchom go za pomocą menu makr programu Excel, jak sugerował „user3616725” z zaakceptowanej odpowiedzi:

Wróć do programu Excel, przejdź do Narzędzia> Makro> Makra i wybierz makro o nazwie „CopyCellContents”, a następnie wybierz Opcje z okna dialogowego. Tutaj możesz przypisać makro do klawisza skrótu (np. Ctrl + c dla normalnej kopii) - ja użyłem Ctrl + q.

Następnie, jeśli chcesz skopiować pojedynczą komórkę do Notatnika / gdziekolwiek, po prostu wykonaj Ctrl + q (lub cokolwiek wybierzesz), a następnie wykonaj Ctrl + v lub Edycja> Wklej w wybranym miejscu docelowym.


Edycja (21 listopada 2015):
@ komentarz od "dotctor":
Nie, to naprawdę nie jest nowe pytanie! Moim zdaniem jest to dobry dodatek do zaakceptowanej odpowiedzi, ponieważ moja odpowiedź dotyczy problemów, z którymi możesz się spotkać korzystając z kodu z zaakceptowanej odpowiedzi. Gdybym miał więcej reputacji, stworzyłbym komentarz.
@ komentarz od „Teepeemm”:
Tak, masz rację, odpowiedzi zaczynające się od tytułu „Problem:” są mylące. Zmieniono na: „Możliwy problem w związku z odpowiedzią od„ user3616725 ”:”. Jako komentarz z pewnością napisałbym znacznie bardziej zwięźle.


Myślę, że to działa jako prawidłowa odpowiedź (chociaż otwarcie z Problemem sprawiło, że wyglądało na to, że masz nowy problem). Komentarze są ograniczone do 600 znaków, więc to zdecydowanie byłoby na to za długie.
Teepeemm

Wspaniale! Dzięki! Jedynym problemem wydaje się być to, że działa tylko dla jednej komórki. Czy można to w jakiś sposób ulepszyć, aby umożliwić kopiowanie zakresów?
NeplatnyUdaj

3

„Jeśli chcesz wybrać wiele komórek i skopiować ich wartości do schowka bez tych irytujących cudzysłowów” ( bez błędów w rozwiązaniu Multi-Cells Petera Smallwooda) „poniższy kod może być przydatny”. Jest to rozszerzenie kodu podanego powyżej od Petera Smallwooda (który „jest rozszerzeniem kodu podanego powyżej od użytkownika 3616725”). To naprawia następujące błędy w rozwiązaniu Petera Smallwooda:

  • Pozwala uniknąć błędu kompilatora „Zmienna niezdefiniowana” (w tym przypadku dla „CR” - „clibboardFieldDelimiter”)
  • Konwertuj pustą komórkę na pusty ciąg zamiast „0”.
  • Zakładka dołączania (ASCII 9) vs. CR (ASCII 13) po każdej komórce.
  • Dołącz CR (ASCII 13) + LF (ASCII 10) (w porównaniu z CR (ASCII 13)) po każdym wierszu.

UWAGA: Nadal nie będzie można kopiować znaków osadzonych w komórce, które spowodowałyby wyjście z pola docelowego, do którego wklejasz tę komórkę (tj. Tab lub CR podczas wklejania do okna edycji tabeli dostępu lub 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

Aby zachować podziały wierszy podczas wklejania w notatniku, zamień tę linię w makrze:

strTemp = ActiveCell.Value

przez:

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

0

Skorzystaj z poniższego wzoru

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

i dostaniesz to, czego chcesz ;-)


2
To załatwia sprawę, ale usuwa moje formatowanie (nowe linie i karty)
Gabriel G,

0

Możesz to zrobić w makrze Excela przez VBA, wysyłając wyniki do pliku:

Sub SimpleVBAWriteToFileWithoutQuotes()
    Open "c:\TEMP\Excel\out.txt" For Output As #1
    Print #1, Application.ActiveSheet.Cells(2, 3)
    Close #1
End Sub

A jeśli chcesz umieścić nazwy plików i zawartość w wielu plikach, oto krótki fragment, który pozwala uniknąć podwójnych cudzysłowów wokół danych wyjściowych.

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
  • jeśli formuła ma wiele linii (oznacza podział linii w formule), to kopiuj wklej będzie działać w ten sposób
  • jeśli można usunąć wiele linii, wówczas podczas kopiowania wklejania nie pojawią się żadne cudzysłowy.
  • w przeciwnym razie użyj funkcji CLEAN, jak powiedział @greg w poprzedniej odpowiedzi

0

Uwaga: przyczyną cudzysłowów jest to, że kiedy dane przenoszone są z programu Excel do schowka, są one w pełni zgodne ze standardami CSV, które obejmują wartości cytowania zawierające tabulatory, nowe wiersze itp. (A znaki podwójnego cudzysłowu są zastępowane dwoma znakami cudzysłowu)

Zatem innym podejściem, szczególnie jak w przypadku OP, gdy tabulatory / nowe linie wynikają ze wzoru, jest użycie alternatywnych znaków dla tabulatorów i twardych zwrotów. Używam ascii Unit Separator = char (31) dla tabulatorów i ascii Record Separator = char (30) dla nowych linii.

Następnie wklejenie do edytora tekstu nie będzie wiązało się z dodatkowymi regułami CSV i możesz wykonać szybkie wyszukiwanie i zamienić, aby ponownie je przekonwertować.

Jeśli karty / nowe linie są osadzone w danych, możesz przeprowadzić wyszukiwanie i zamienić w programie Excel, aby je przekonwertować.

Niezależnie od tego, czy używasz formuły, czy zmieniasz dane, kluczem do wyboru separatorów nigdy nie jest używanie znaków, które mogą znajdować się w rzeczywistych danych. Dlatego polecam postacie ascii niskiego poziomu.


-1

Możliwe jest również usunięcie tych podwójnych cudzysłowów poprzez umieszczenie wyniku w funkcji „Wyczyść”.

Przykład:

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

Wynik zostanie wklejony bez cudzysłowów w innych programach, takich jak Notepad ++.


To jest podwójna odpowiedź. CLEAN usuwa również
znaki
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.