問題:
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."
これらの二重引用符が表示されないようにする方法別のプログラムにコピーするときつまり、セルがクリップボードにコピーされたときにこれらが自動的に追加されないようにすることはできますか?
ワードパッド、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 または、編集>選択した宛先に貼り付けます。
私の答えは、(いくつかの追加を加えて)以下からコピーされます: here
編集:(コメントから)
参照リストにMicrosoft Forms 2.0 Libraryが見つからない場合は、試すことができます
C:\Windows\System32\FM20.dll
(32ビットWindows)を選択(@JWhyに感謝)C:\Windows\SysWOW64\FM20.dll
を選択します(64ビット)私はちょうどこの問題を抱えており、各セルをCLEAN
関数でラップすると修正されました。 =CLEAN(
を実行し、セルを選択してから、残りの列を自動入力することで、比較的簡単に実行できます。これを行った後、メモ帳または他のプログラムに貼り付けると、引用符が重複しなくなりました。
最初にWordに貼り付けてから、メモ帳に貼り付けると引用符なしで表示されます
複数セルを選択し、それらの値をクリップボードにすべての迷惑な引用符なしでコピーしたい場合、次のコードが役に立つかもしれません。これは、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
引用符の問題に出くわしたときの解決策は、セルのテキストの末尾から改行を削除することでした。これらの復帰(外部プログラムによって挿入される)のため、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のセルに貼り付けると、次のように、疑問符の付いた四角形で構成される2つのシンボルが表示されます。メモ帳に貼り付けても何も表示されません。
解決策:
かなり長い間検索した後、 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に戻り、[ツール]> [マクロ]> [マクロ]に移動し、[CopyCellContents]というマクロを選択して、ダイアログから[オプション]を選択します。ここで、マクロをショートカットキーに割り当てることができます(通常のコピーの場合はCtrl + cなど)-Ctrl + qを使用しました。
次に、単一のセルをメモ帳/どこにでもコピーする場合は、Ctrl + q(または選択したもの)を実行してから、選択したコピー先でCtrl + vまたは[編集]> [貼り付け]を実行します。
編集(2015年11月21日):
@「dotctor」からのコメント:
いいえ、これは真剣に新しい質問ではありません!私の意見では、受け入れられた回答のコードを使用する際に直面する可能性のある問題を解決するので、受け入れられた回答の良い追加です。もっと評判があれば、コメントを作成していました。
@「Teepeemm」からのコメント:
はい、あなたは正しいです。タイトル「Problem:」で始まる答えは誤解を招きます。 「user3616725」からの回答に関連して考えられる問題:」に変更されました。コメントとして、私は確かにはるかにコンパクトに書いていただろう。
「multipleを選択し、それらの迷惑な引用符なしでセルに値をクリップボードにコピーする場合」(without Peter Smallwoodのマルチセルソリューションのバグ)「次のコードが役立つ場合があります。」これは、Peter Smallwoodからの上記のコードの拡張です(「user3616725からの上記のコードの拡張」)。これにより、Peter Smallwoodのソリューションの次のバグが修正されます。
注:セル内に埋め込まれた文字をコピーして、そのセルを貼り付ける先のフィールドを終了することはできません(つまり、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
以下の式を使用してください
=Clean("1"&CHAR(9)&"SOME NOTES FOR LINE 1."&CHAR(9)&"2"&CHAR(9)&"SOME NOTES FOR LINE 2.")
そして、あなたはあなたが望むものを手に入れるでしょう;-)
結果を「クリーン」機能に配置することにより、これらの二重引用符を削除することもできます。
例:= CLEAN( "1"&CHAR(9)& "行1の注意事項"&CHAR(9)& "2"&CHAR(9)& "行2の注意事項")
出力は、Notepad ++などの他のプログラムに二重引用符なしで貼り付けられます。
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
メモ帳に貼り付けるときに改行を保持するには、マクロの次の行を置き換えます。
strTemp = ActiveCell.Value
によって:
strTemp = Replace(ActiveCell.Value, Chr(10), vbCrLf)