셀에서 복사할 때 따옴표 생략
문제:
프로그램 외부에서 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."
다른 프로그램으로 복사할 때 이러한 이중 따옴표가 표시되지 않도록 하려면 어떻게 해야 합니까?즉, 셀이 클립보드에 복사될 때 자동으로 추가되지 않도록 할 수 있습니까?
문제가 하여 각 을 이이 each each each each each each each each each each each 로 감싸고 .CLEAN수가가고고고고고은 비교적 할 수 입니다.=CLEAN(셀을 선택하고 나머지 열을 자동으로 채웁니다.이렇게 하면 메모장이나 다른 프로그램에 붙여넣기 할 때 따옴표가 중복되지 않게 됩니다.
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
프로젝트(워크북)에 표준 모듈을 추가하려면 +를 사용하여 F11VBE를 열고 왼쪽 상단의 프로젝트 창에서 워크북을 오른쪽 클릭하여 [Insert]> [ Module ]를 선택합니다.오른쪽에 열리는 코드 모듈 창에 코드를 붙여넣습니다.
Excel로 돌아가 [툴]> [매크로]> [매크로스]순서로 이동하여 [Copy Cell Contents]라고 하는 매크로를 선택하고 대화상자에서 [옵션]를 선택합니다.여기서 매크로를 바로 가기 키에 할당할 수 있습니다(일반 복사에서는 +와 C같이). +Q를 사용했습니다.
그런 다음 단일 셀을 메모장이나 장소에 복사하려면 Ctrl+q(또는 선택한 항목)를 누른 후 선택한 대상에 V+ 또는 Edit > Paste(붙여넣기)를 수행합니다.
답변은 (몇 가지 추가사항을 포함하여) 다음에서 복사한 것입니다.
편집: (댓글에서)
참조 목록에 Microsoft Forms 2.0 Library가 없는 경우,
- FM20을 찾습니다.대신 DLL(Peter Smallwood @감사합니다)
- [ ]를 클릭하여 [Select]를 합니다.
C:\Windows\System32\FM20.dllWindows) (JWHY) (32비트 Windows) (32비트 Windows)(JWHY) - [ ]를 클릭하여 [Select]를 합니다.
C:\Windows\SysWOW64\FM20.dll(64비트)
먼저 Word에 붙여넣은 후 메모장에 붙여넣으면 따옴표 없이 나타납니다.
여러 셀을 선택하고 귀찮은 따옴표 없이 값을 클립보드에 복사하는 경우 다음 코드가 유용할 수 있습니다.이것은 사용자 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
"여러 셀을 선택하고 그 값을 따옴표 없이 클립보드에 복사하고 싶다면"(Peter Smallwood의 멀티 셀 솔루션 버그 없음) "다음 코드가 유용할 수 있습니다."이는 Peter Smallwood에서 상기에 제시된 코드를 확장한 것입니다('사용자 3616725에서 상기에 제시된 코드를 확장한 것입니다).이를 통해 Peter Smallwood 솔루션의 다음 오류를 해결할 수 있습니다.
- "Variable not defined" 컴파일러 오류를 회피합니다("CR" - "clibboard Field Delimiter "의 경우").
- 빈 셀을 빈 문자열 대 "0"으로 변환합니다.
- 각 셀 뒤에 추가 탭(ASCII 9)과 CR(ASCII 13)이 있습니다.
- 각 행 뒤에 CR(ASCII 13) + LF(ASCII 10)를 추가합니다(vs. CR(ASCII 13)).
메모: 셀에 포함된 문자를 복사할 수 없습니다.이 경우 해당 셀을 붙여넣을 대상 필드(접근 편집 창 또는 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
인용문제로 넘어갔을 때 해결방법은 셀의 텍스트 끝부분에서 캐리지 리턴을 제거하는 것이었습니다.이러한 캐리지 리턴(외부 프로그램에 의해 삽입됨) 때문에 Excel은 문자열 전체에 따옴표를 추가했습니다.
"user3616725"로부터의 할 수 있는 :
Windows 8.1 의 경우, 「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의 셀에 클립보드를 붙여넣으면 다음과 같은 물음표가 있는 정사각형으로 구성된 두 개의 심볼이 나타납니다.메모장에 붙여넣어도 아무것도 표시되지 않습니다.
★★★★★★★★★★★★★★★★★★:
한참을 검색한 결과 Windows API를 사용하는 사용자 "Nepumuk"의 다른 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로 돌아가 [툴]> [매크로]> [매크로스]순서로 이동하여 [Copy Cell Contents]라고 하는 매크로를 선택하고 대화상자에서 [옵션]를 선택합니다.여기서 매크로를 바로 가기 키에 할당할 수 있습니다(예: 일반 복사본의 경우 Ctrl+c). Ctrl+q를 사용했습니다.
그런 다음 단일 셀을 메모장이나 장소에 복사하려면 Ctrl+q(또는 선택한 항목)를 누른 후 Ctrl+v 또는 Edit>Paste(편집>붙여넣기)를 선택합니다.
(2015년 11월 21일):
@ from " : @ "dotector" :
니,, 건건새새새문!제 답변은 수락된 답변에서 코드를 사용할 때 직면할 수 있는 문제를 다루고 있기 때문에 수락된 답변에 대한 좋은 추가라고 생각합니다.내가 좀 더 평판이 좋다면 댓글을 달았을 텐데.
@ ":@ "Teepem"의 코멘트:
'의 소지가 있습니다. "문제:"라는 제목으로 시작하는 답변은 오해의 소지가 있습니다.from "user3616725"로 되었습니다.코멘트로서 나는 확실히 훨씬 더 간결하게 썼을 것이다.
주의: 데이터가 Excel에서 클립보드로 이동할 때 CSV 표준에 완전히 준거하기 때문입니다.탭, 새 행 등의 견적 값이 포함되어 있습니다(또한 이중 따옴표는 2개의 큰따옴표로 대체됩니다).
따라서 OP의 경우, 특히 탭/새 행이 수식으로 인해 발생하는 경우와 마찬가지로 탭과 하드 리턴에 대체 문자를 사용하는 방법이 있습니다.탭에는 ascii 단위 구분 기호 =char(31)를 사용하고 새 줄에는 ascii 레코드 구분 기호 =char(30)를 사용합니다.
그런 다음 텍스트 편집기에 붙여넣기에는 추가 CSV 규칙이 필요하지 않으며 빠른 검색을 수행하여 다시 변환할 수 있습니다.
데이터에 탭/새 행이 포함된 경우 검색을 수행하여 Excel로 대체하여 변환할 수 있습니다.
수식을 사용하든 데이터를 변경하든 구분 기호를 선택하는 열쇠는 실제 데이터에 있을 수 있는 문자를 사용하지 않는 것입니다.그래서 저는 낮은 수준의 ASCII 문자를 추천합니다.
메모장에 붙여넣을 때 줄 바꿈을 유지하려면 매크로에서 다음 줄을 바꿉니다.
strTemp = ActiveCell.Value
기준:
strTemp = Replace(ActiveCell.Value, Chr(10), vbCrLf)
"이것들"은 다음과 같습니다.
을 사용하다 이치노
Ctrl+A를 누른 상태에서 다시 복사하고 초안 전자 메일을 삭제합니다.
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
- 복수의 라인이 있는 수식(식중에 라인이 끊어져 있는 수식)의 경우, 카피 페이스트는 그 방법으로 동작합니다.
- 여러 줄을 제거할 수 있는 경우 복사 붙여넣기 중에 따옴표는 표시되지 않습니다.
- 그렇지 않으면 이전 답변에서 @greg가 말한 클린 함수를 사용합니다.
저도 같은 문제를 겪고 있었는데 이 게시물의 어떤 해결책도 도움이 되지 않았습니다.그럼 다른 사람들도 같은 상황에 처할 경우를 대비해서 나에게 확실히 효과가 있었던 해결책을 알려줄게.
첫째, 이 솔루션은 사용자가 파일 탐색기를 사용하여 "Quick Accesss 폴더"에 액세스할 때 VBA를 사용하여 클립보드 콘텐츠를 읽을 수 없는 콘텐츠로 변환하는 원인이 되는 최근 Microsoft에 보고된 버그에도 준거하고 있습니다.
copy past bug의 해결책에 관한 매뉴얼(이 답변에서는 코드를 사용하여 클립보드에서 따옴표를 삭제합니다.https://learn.microsoft.com/en-us/office/vba/access/Concepts/Windows-API/send-information-to-the-clipboard
아래와 같이 매크로를 빌드하고 "hotkey+c"를 단축키로 할당해야 합니다(바로 가기 키 할당 = 개발자 탭, 매크로, 매크로, 옵션을 클릭한 후 단축키 필드에 문자 "c"를 넣으십시오).
Sub ClipboardRemoveQuotes()
Dim strClip As String
strClip = Selection.Copy
strClip = GetClipboard()
On Error Resume Next - Needed in case clipboard is empty
strClip = Replace(strClip, Chr(34), "")
On Error GoTo 0
SetClipboard (strClip)
End Sub
이 경우에도 "SetClipboard" 및 "GetClipboard" 함수를 빌드해야 합니다.
아래에는 "SetClipboard" 및 "GetClipboard" 함수의 정의가 나와 있습니다.또, 다른 Excel 버전에 맞추어 몇개의 조정을 실시합니다.(아래 코드를 모듈에 입력해 주세요.)
Option Explicit
#If VBA7 Then
Private Declare PtrSafe Function OpenClipboard Lib "User32" (ByVal hWnd As LongPtr) As LongPtr
Private Declare PtrSafe Function EmptyClipboard Lib "User32" () As LongPtr
Private Declare PtrSafe Function CloseClipboard Lib "User32" () As LongPtr
Private Declare PtrSafe Function IsClipboardFormatAvailable Lib "User32" (ByVal wFormat As LongPtr) As LongPtr
Private Declare PtrSafe Function GetClipboardData Lib "User32" (ByVal wFormat As LongPtr) As LongPtr
Private Declare PtrSafe Function SetClipboardData Lib "User32" (ByVal wFormat As LongPtr, ByVal hMem As LongPtr) As LongPtr
Private Declare PtrSafe Function GlobalAlloc Lib "kernel32.dll" (ByVal wFlags As Long, ByVal dwBytes As Long) As LongPtr
Private Declare PtrSafe Function GlobalLock Lib "kernel32.dll" (ByVal hMem As LongPtr) As LongPtr
Private Declare PtrSafe Function GlobalUnlock Lib "kernel32.dll" (ByVal hMem As LongPtr) As LongPtr
Private Declare PtrSafe Function GlobalSize Lib "kernel32" (ByVal hMem As LongPtr) As Long
Private Declare PtrSafe Function lstrcpy Lib "kernel32.dll" Alias "lstrcpyW" (ByVal lpString1 As Any, ByVal lpString2 As Any) As LongPtr
#Else
Private Declare Function OpenClipboard Lib "user32.dll" (ByVal hWnd As Long) As Long
Private Declare Function EmptyClipboard Lib "user32.dll" () As Long
Private Declare Function CloseClipboard Lib "user32.dll" () As Long
Private Declare Function IsClipboardFormatAvailable Lib "user32.dll" (ByVal wFormat As Long) As Long
Private Declare Function GetClipboardData Lib "user32.dll" (ByVal wFormat As Long) 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 GlobalSize Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function lstrcpy Lib "kernel32.dll" Alias "lstrcpyW" (ByVal lpString1 As Long, ByVal lpString2 As Long) As Long
#End If
Public Sub SetClipboard(sUniText As String)
#If VBA7 Then
Dim iStrPtr As LongPtr
Dim iLock As LongPtr
#Else
Dim iStrPtr As Long
Dim iLock As Long
#End If
Dim iLen As Long
Const GMEM_MOVEABLE As Long = &H2
Const GMEM_ZEROINIT As Long = &H40
Const CF_UNICODETEXT As Long = &HD
OpenClipboard 0&
EmptyClipboard
iLen = LenB(sUniText) + 2&
iStrPtr = GlobalAlloc(GMEM_MOVEABLE Or GMEM_ZEROINIT, iLen)
iLock = GlobalLock(iStrPtr)
lstrcpy iLock, StrPtr(sUniText)
GlobalUnlock iStrPtr
SetClipboardData CF_UNICODETEXT, iStrPtr
CloseClipboard
End Sub
Public Function GetClipboard() As String
#If VBA7 Then
Dim iStrPtr As LongPtr
Dim iLock As LongPtr
#Else
Dim iStrPtr As Long
Dim iLock As Long
#End If
Dim iLen As Long
Dim sUniText As String
Const CF_UNICODETEXT As Long = 13&
OpenClipboard 0&
If IsClipboardFormatAvailable(CF_UNICODETEXT) Then
iStrPtr = GetClipboardData(CF_UNICODETEXT)
If iStrPtr Then
iLock = GlobalLock(iStrPtr)
iLen = GlobalSize(iStrPtr)
sUniText = String$(iLen \ 2& - 1&, vbNullChar)
lstrcpy StrPtr(sUniText), iLock
GlobalUnlock iStrPtr
End If
GetClipboard = sUniText
End If
CloseClipboard
End Function
나에게 도움이 되는 만큼 다른 사람에게도움이 됐으면 좋겠어요.
같은 문제:콘솔 프로그램의 입력으로 Excel 공식(새 행 포함, 추가 견적 없음)이 필요합니다.
개인 솔루션:program, 나는 달린다squ | program(또는squ | program > OUT그런 다음 셀의 내용을 콘솔에 복사/붙여넣습니다(마지막에는 매뉴얼 [Ctrl]+[Z]가 필요할 수 있습니다).
스퀴의 소스는 다음과 같습니다.
#include <stdio.h>
int main(void)
{
char c[2];
while(fgets(c,2,stdin)) if(*c!=34) fputs(c,stdout);
return 0;
}
아래 수식을 사용해 주세요.
=Clean("1"&CHAR(9)&"SOME NOTES FOR LINE 1."&CHAR(9)&"2"&CHAR(9)&"SOME NOTES FOR LINE 2.")
원하는 것을 얻을 수 있습니다;-)
또한 "클린" 기능에 결과를 배치하여 이러한 이중 따옴표를 제거할 수도 있습니다.
예:
=CLEAN("1"&CHAR(9)&"SOME NOTES FOR LINE 1."&CHAR(9)&"2"&CHAR(9)&"SOME NOTES FOR LINE 2.")
출력은, 메모장++등의 다른 프로그램에 큰따옴표를 붙이지 않고 붙여넣습니다.
언급URL : https://stackoverflow.com/questions/24910288/leave-out-quotes-when-copying-from-cell
'codememo' 카테고리의 다른 글
| NSDictionary 또는 NSMutableDictionary에 키가 포함되어 있는지 확인하는 방법 (0) | 2023.04.18 |
|---|---|
| SQL-Server에 퍼센트 값을 저장하는 가장 좋은 방법은 무엇입니까? (0) | 2023.04.18 |
| bash에 함수가 존재하는지 확인합니다. (0) | 2023.04.18 |
| Bash의 마지막 명령어 출력 재사용 (0) | 2023.04.18 |
| 어플리케이션의 기능은 정확히 무엇입니까?Excel의 CutCopyMode 속성 (0) | 2023.04.13 |