셀에서 복사 할 때 따옴표를 생략


90

문제점 :
프로그램 외부에서 Excel에서 셀을 복사 할 때 큰 따옴표가 자동으로 추가됩니다.

세부 정보 :
Windows 7 컴퓨터에서 Excel 2007을 사용하고 있습니다. 다음 공식을 가진 셀이있는 경우 :

="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 2014-07-23

내 설정에서 @ McAdam331, 형식이 텍스트와 같은 경우 셀은 계산 된 결과가 아니라 수식을 표시합니다. 숫자 형식은 어떤 이유로 이것을 무시하는 것 같습니다.
Aaron Thomas

공식을 사용하기로 선택한 이유는 무엇입니까? Excel이 탭 문자를 삽입하는 쉬운 방법을 지원하지 않기 때문입니까? 이 문제를 해결할 수없는 것 같습니다. 사용할 수있는 Excel 이외의 옵션이있을 수 있지만 프로젝트의 특성이 무엇인지 잘 모르겠습니다.
AdamMc331

또한 번거로울 수 있지만 Excel을 열고 셀 (기본적으로 일반 형식)에 입력을 시작하고 텍스트를 입력하면 따옴표없이 복사됩니다. (Excel 2013 및 Notepad ++를 사용하여 테스트) 탭 대신 공백 4 개만 입력하면 프로젝트에 영향을 줍니까? 다시 말하지만 나머지 문제를 알지 못하면 말하기가 어렵습니다.
AdamMc331 2014-07-23

1
@ McAdam331 불행히도 여기에 넣은 것처럼 선행 및 후행 큰 따옴표를 빼고 정확하게 작동하려면 이것이 필요합니다. 탭이이 질문의 초점에서 벗어나지 않도록하십시오. 탭이 있어야합니다.
Aaron Thomas

답변:


29

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

프로젝트 (통합 문서)에 표준 모듈을 추가하려면 Alt+로 VBE를 연 F11다음 왼쪽 상단의 프로젝트 창에서 통합 문서를 마우스 오른쪽 버튼으로 클릭하고 삽입> 모듈을 선택합니다. 오른쪽에 열리는 코드 모듈 창에 코드를 붙여 넣습니다.

Excel로 돌아가 도구> 매크로> 매크로로 이동하고 "CopyCellContents"라는 매크로를 선택한 다음 대화 상자에서 옵션을 선택합니다. 여기에서 매크로를 바로 가기 키 (예 : 일반 복사의 경우 CTRL+) C에 할당 할 수 있습니다 .-나는 CTRL+를 사용했습니다 Q.

그런 다음 메모장 / 어디서나 단일 셀을 복사하려면 Ctrl + q (또는 선택한 항목)를 수행 한 다음 선택한 대상에서 CTRL+ V또는 편집> 붙여 넣기를 수행합니다.

내 대답은 (몇 가지 추가로) 복사 : 여기

편집 : (댓글에서)

참조 목록에서 Microsoft Forms 2.0 Library를 찾지 못한 경우 다음을 시도해보십시오.

  • 대신 FM20.DLL을 찾고 있습니다 (@Peter Smallwood에게 감사드립니다)
  • 찾아보기를 클릭하고 선택 C:\Windows\System32\FM20.dll(32 비트 Windows) (@ JWhy에게 감사)
  • 찾아보기를 클릭하고 선택 C:\Windows\SysWOW64\FM20.dll (64 비트)

1
VBA가 이에 대한 유일한 해결책 인 것 같습니다. 입력 해 주셔서 감사합니다.
아론 토마스

1
당신은 다음 FM20.DLL을 찾아 참조 목록에 lib에는 마이크로 소프트 양식을 볼 수없는 경우
피터 스몰 우드

15
Notepad ++에 붙여 넣으면 여전히 따옴표가 표시됩니다.
Kat

1
@monkeyintern 한 셀에 여러 줄의 텍스트가 있고 셀당 한 줄로 분할하면 주변을 둘러 볼 수 있습니다.
Kat

2
@ user3616725 업데이트 된 버전으로 인해이 동작이 변경되었을 수 있지만 현재 버전의 Word 및 Notepad ++ (이 주석 게시 날짜 기준)에서는 단일 또는 다중 셀 선택시 이러한 따옴표를 붙여 넣습니다.
Tony

81

나는 방금이 문제가 있었고 각 셀을 CLEAN기능으로 감싸서 해결 했습니다. 을 수행하고 =CLEAN(셀을 선택한 다음 나머지 열을 자동으로 채우면 비교적 쉽게 수행 할 수 있습니다 . 이렇게 한 후에 메모장이나 다른 프로그램에 붙여 넣을 때 더 이상 중복 된 따옴표가 없었습니다.


20
추가 따옴표를 지우는 데는 좋은 대답이지만 불행히도 탭 문자도 지워집니다. 질문에서 유지하고 싶습니다. 그래도 입력 해 주셔서 감사합니다!
Aaron Thomas

이것은 나를 위해 일했으며 탭에 대해서는 신경 쓰지 않았습니다. 사실 나는 모든 탭과 개행 문자를 어쨌든 제거하고 싶었습니다.
Cody

19
32 이하의 모든 ASCII 문자를 제거합니다. 새 줄도 마찬가지입니다.
NeplatnyUdaj

1
이것이 진정한 답입니다.
Tyler Murry

10
이것은 모든 특수 문자를 제거하므로 좋은 해결책이 아닙니다.
Paul

26

먼저 Word에 붙여 넣은 다음 메모장에 붙여 넣으면 따옴표없이 표시됩니다.


입력 해 주셔서 감사합니다.하지만 좋은 해결책으로 표시 할 수 없습니다. 또한이 질문에 이미 제공된 솔루션의 복제본입니다 . stackoverflow.com/a/24913557/2658159를 참조하십시오 .
Aaron Thomas

4
감사합니다.이 솔루션이 마음에 들었습니다. 빠르고 쉬운
Bajal

이 항목을 찬성하는 중 ... 제 경우에는 특정 유형의 요청에 대해 데이터가 Excel 파일로 제공되고 일반 텍스트 상자에 붙여 넣어야한다는 것이 문제였습니다. 그렇게하면 따옴표를 얻습니다. 나는 여분의 따옴표를 제거하기 위해 텍스트 편집기를 사용했다 (따옴표도 .. 성가시다!). 간단한 해결책을 찾고, 여분의 따옴표가 사라지면서 Word에 붙여 넣기가 먼저 작동 함을 발견했습니다. 이 10 배를
찬성

탭 문자가 제거됩니다. 적어도 확실하지 워드 패드에 대해, 단어를 사용하는 경우
마태 복음 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) (vs. CR (ASCII 13))를 추가합니다. 참고 : 해당 셀을 붙여 넣는 대상 필드 (예 : Access 또는 SSMS의 테이블 편집 창에 붙여 넣을 때 Tab 또는 CR)를 종료하는 셀 내에 포함 된 문자를 여전히 복사 할 수 없습니다.
Tom

^ 또한 "정의되지 않은 변수"컴파일러 오류 수정 ( "CR"변수의 경우).
Tom

4

따옴표 문제가 발생했을 때 내 솔루션은 내 셀 텍스트 끝에서 캐리지 리턴을 제거하는 것이 었습니다. 이러한 캐리지 리턴 (외부 프로그램에 의해 삽입 됨) 때문에 Excel은 전체 문자열에 따옴표를 추가했습니다.


4
따옴표는 수식 내부의 CR / LF (반드시 끝이 아님)의 결과이거나이 스레드의 원래 질문 (char (9))과 같은 탭일 수도 있습니다.
Turbo

당신은 정말 쉽게 내 인생했다
드 소스

3

"user3616725"의 답변과 관련하여 가능한 문제 :
Windows 8.1의 Im이며 "user3616725"의 승인 된 답변에서 링크 된 VBA 코드에 문제가있는 것 같습니다.

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의 셀에 붙여 넣으면 내부에 물음표가있는 사각형으로 구성된 두 개의 기호가 나타납니다. ⍰⍰. 메모장에 붙여 넣어도 아무것도 표시되지 않습니다.

솔루션 :
꽤 오랫동안 검색 한 후 "Nepumuk"사용자로부터 Windows API를 사용하는 또 다른 VBA 스크립트를 찾았습니다 . 마침내 나를 위해 일한 그의 코드는 다음과 같습니다.

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

그리고 수락 된 답변에서 "user3616725"에서 제안한 것처럼 Excel 매크로 메뉴를 통해 실행합니다.

Excel로 돌아가서 도구> 매크로> 매크로로 이동하고 "CopyCellContents"라는 매크로를 선택한 다음 대화 상자에서 옵션을 선택합니다. 여기에서 매크로를 바로 가기 키 (예 : 일반 복사의 경우 Ctrl + c)에 할당 할 수 있습니다. 저는 Ctrl + q를 사용했습니다.

그런 다음 단일 셀을 메모장 / 어디서나 복사하려면 Ctrl + q (또는 선택한 항목)를 수행 한 다음 선택한 대상에서 Ctrl + v 또는 편집> 붙여 넣기를 수행하십시오.


편집 (2015 년 11 월 21 일) :
"dotctor"의 @ 코멘트 :
아니요, 진지하게 새로운 질문이 아닙니다! 내 대답은 수락 된 답변의 코드를 사용할 때 직면 할 수있는 문제를 해결하기 때문에 수락 된 답변에 대한 좋은 추가입니다. 평판이 더 좋으면 댓글을 달았을 것입니다.
@ "Teepeemm"의 코멘트 :
예, 맞습니다. 제목 "문제 :"로 시작하는 답변은 잘못된 것입니다. 변경 : ""user3616725 "의 답변과 관련하여 가능한 문제 :". 코멘트로서 나는 확실히 훨씬 더 간결하게 작성했을 것입니다.


나는 이것이 유효한 대답으로 작동한다고 생각합니다 ( 문제 로 열면 새로운 문제가있는 것처럼 보였지만 ). 그리고 댓글은 600 자로 제한되므로 너무 길어질 수 있습니다.
Teepeemm

훌륭한! 감사! 유일한 문제는 단일 셀에서만 작동한다는 것입니다. 범위 복사를 허용하도록 개선 할 수 있습니까?
NeplatnyUdaj

3

" 여러 셀 을 선택 하고 모든 성가신 따옴표없이 클립 보드에 값을 복사하려면"( Peter Smallwood의 다중 셀 솔루션의 버그 없이 ) "다음 코드가 유용 할 수 있습니다." 이것은 Peter Smallwood ( "user3616725에서 위에 제공된 코드의 향상")에서 위에 제공된 코드의 향상입니다. 이것은 Peter Smallwood의 솔루션에서 다음 버그를 수정합니다.

  • "변수가 정의되지 않음"컴파일러 오류 방지 ( "CR"- "clibboardFieldDelimiter"여기에서)
  • 빈 셀을 빈 문자열 대 "0"으로 변환합니다.
  • 각 셀 뒤에 탭 (ASCII 9)과 CR (ASCII 13)을 추가합니다.
  • 각 행 뒤에 CR (ASCII 13) + LF (ASCII 10) (vs. CR (ASCII 13))를 추가합니다.

참고 : 해당 셀을 붙여 넣는 대상 필드 (예 : Access 또는 SSMS의 테이블 편집 창에 붙여 넣을 때 탭 또는 CR)를 종료하는 셀에 포함 된 문자를 여전히 복사 할 수 없습니다.


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

VBA를 통해 Excel 매크로에서이 작업을 수행하여 결과를 파일로 보낼 수 있습니다.

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
  • 수식에 여러 줄이있는 경우 (수식에 줄 바꿈이 있음을 의미) 복사 붙여 넣기가 이러한 방식으로 작동합니다.
  • 여러 줄을 제거 할 수있는 경우 복사 붙여 넣기 동안 따옴표가 나타나지 않습니다.
  • 그렇지 않으면 이전 답변에서 @greg가 말한 것처럼 CLEAN 기능을 사용하십시오.

0

참고 : 따옴표의 원인은 데이터가 Excel에서 클립 보드로 이동할 때 탭, 새 줄 등을 포함하는 따옴표 값을 포함하는 CSV 표준을 완전히 준수하기 때문입니다 (큰 따옴표 문자는 두 개의 큰 따옴표 문자로 대체 됨).

따라서 특히 탭 / 새 줄이 수식으로 인한 OP의 경우와 같이 또 다른 접근 방식은 탭 및 하드 리턴에 대체 문자를 사용하는 것입니다. 탭에는 ascii Unit Separator = char (31)을 사용하고 새 줄에는 ascii Record Separator = char (30)을 사용합니다.

그런 다음 텍스트 편집기에 붙여 넣으면 추가 CSV 규칙이 포함되지 않으며 빠른 검색을 수행하고 교체하여 다시 변환 할 수 있습니다.

탭 / 새 줄이 데이터에 포함 된 경우 Excel에서 검색 및 바꾸기를 수행하여 변환 할 수 있습니다.

수식을 사용하든 데이터를 변경하든 구분 기호를 선택하는 핵심은 실제 데이터에있을 수있는 문자를 사용하지 않는 것입니다. 이것이 저수준 ASCII 문자를 권장하는 이유입니다.


-1

결과를 "Clean"기능에 배치하여 이러한 큰 따옴표를 제거 할 수도 있습니다.

예:

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

출력은 Notepad ++와 같은 다른 프로그램에 큰 따옴표없이 붙여 넣어집니다.


이것은 중복 된 답변입니다. CLEAN는 등 줄 바꿈, 탭, 스트립
posfan12
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.