セルからコピーするときは引用符を省略します


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 14

@ McAdam331の設定では、形式がテキストのような場合、セルは計算結果ではなく数式を表示します。数値としてのフォーマットは、何らかの理由でこれをオーバーライドするようです。
アーロントーマス

なぜこの数式を使用することにしたのですか?Excelがタブ文字を挿入する簡単な方法をサポートしていないためですか?私もこれを回避することができないようです、おそらくExcel以外に使用できるオプションがあるかもしれませんが、プロジェクトの性質が何かはわかりません。
AdamMc331 2014

また、面倒かもしれませんが、Excelを開いてセルに入力し始めると(デフォルトでは「一般」としてフォーマットされています)、テキストを入力すると、引用符なしでコピーされます。(Excel 2013とNotepad ++を使用してテスト済み)タブではなく4つのスペースを入力するだけでプロジェクトに影響はありますか?繰り返しになりますが、問題の残りの部分を知らずに言うことは困難です。
AdamMc331 2014

1
@ McAdam331残念ながら、これをここで入力したとおりに機能させるには、先頭と末尾の二重引用符を除いてください。タブがこの質問の焦点から外れないようにしてください。タブはそこにあるはずです。
アーロン・トーマス

回答:


28

ワードパッド、メモ帳++、またはワードに貼り付けてみても、この問題は発生しません。セルの値を純粋なテキストとしてコピーするには、マクロを使用する必要があります。

これを適用するブック(または複数のブックで使用する場合は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+ F11でVBEを開き、左上のプロジェクトウィンドウでワークブックを右クリックして、[挿入]> [モジュール]を選択します。右側に開くコードモジュールウィンドウにコードを貼り付けます。

Excelに戻り、[ツール]> [マクロ]> [マクロ]に移動して、「CopyCellContents」というマクロを選択し、ダイアログから[オプション]を選択します。ここで、マクロをショートカットキーに割り当てることができます(通常のコピーのCTRL+ などC)-私はCTRL+ を使用しましたQ

次に、単一のセルをメモ帳/どこにでもコピーする場合は、Ctrl + q(または選択したもの)を実行してから、選択した宛先でCTRL+ VまたはEdit> Pasteを実行します。

私の答えは(いくつか追加して)コピーされます:ここから

編集:(コメントから)

参照リストにMicrosoft Forms 2.0 Libraryが見つからない場合は、

  • 代わりにFM20.DLLを探します(@Peter Smallwoodに感謝)
  • [参照]をクリックしてC:\Windows\System32\FM20.dll(32ビットWindows)を選択(thanks @JWhy)
  • [参照]をクリックして選択C:\Windows\SysWOW64\FM20.dll (64ビット)

1
VBAがこれに対する唯一の解決策のようです-入力ありがとうございます。
アーロントーマス

1
参照のリストにMicrosoft Forms libが表示されない場合は、FM20.DLLを参照してください
Peter Smallwood

15
Notepad ++に貼り付けると、まだ見積もりが表示されます。
Kat

1
@monkeyintern 1つのセルに複数行のテキストがあったと思います。セルごとに1行に分割すると、回避できます。
Kat

2
@ user3616725更新されたバージョンでこの動作が変更された可能性がありますが、現在のバージョンのWordおよびNotepad ++(このコメントの投稿日現在)では、単一または複数のセルを選択したときにこれらの引用符を貼り付けます。
Tony

80

私はこの問題を抱えていて、各セルをCLEAN関数でラップして修正しました。を実行し=CLEAN(、セルを選択してから、残りの列を自動入力することで、比較的簡単に行うことができます。これを実行した後、メモ帳または他のプログラムに貼り付けたときに、重複した引用符がなくなりました。


20
余分な引用符を削除するための良い答えですが、残念ながらそれはタブ文字も削除します...質問では、私は保持したいと思います。入力ありがとうございます!
アーロン・トーマス

これは私にとってはうまくいきました。タブについては気にしませんでした。実際、すべてのタブと改行文字を削除したいと思っていました。
Cody

19
32未満のすべてのASCII文字を削除します。したがって、新しい行も削除されます。
NeplatnyUdaj

1
これが本当の答えです。
タイラーマリー

10
すべての特殊文字が削除されるため、これは良い解決策ではありません。
ポール

25

最初にそれをWordに貼り付けてから、メモ帳に貼り付けると、引用符なしで表示されます


入力ありがとうございますが、これを適切な解決策とすることはできません。さらに、これはこの質問にすでに提供されているソリューションの複製です。stackoverflow.com/ a / 24913557/2658159を参照してください。
アーロン・トーマス、

4
おかげで、私はこのソリューションが好きでした。迅速かつ簡単に
Bajal

これを支持する...私の場合、私の問題は、受け取った特定の種類の要求に対して、データがExcelファイルで送信され、プレーンテキストボックスに貼り付ける必要があることでした。それをするとき、私は引用符を取得します。テキストエディターを使用して余分な引用符を削除しました(引用符も引用しました。煩わしい!)。簡単な解決策を探したところ、Wordへの貼り付けは、余分な引用符がなくなったときに最初に機能することがわかりました。私はこの10倍に
賛成できればいいのに

これにより、タブ文字が削除されます。少なくとも単語を使用する場合、ワードパッドについては不明
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 2017年

2
この回答に基づいて、以下のバグを修正した私の回答を参照してください。1.空のセルを「0」ではなく空の文字列に変換します。2.各セルの後にタブ(ASCII 9)とCR(ASCII 13)を追加します。3.各行の後にCR(ASCII 13)+ LF(ASCII 10)(vs. CR(ASCII 13))を追加します。注:セル内に埋め込まれている文字をコピーすることはできません。これは、そのセルを貼り付けているターゲットフィールドが終了する原因になります(つまり、アクセスまたはSSMSの編集テーブルウィンドウに貼り付けたときにタブまたはCR)。
トム・

^ "変数が定義されていません"コンパイラエラーも修正します( "CR"変数の場合)。
トム・

4

見積もりの​​問題が発生したときの私の解決策は、セルのテキストの最後から改行を取り除くことでした。これらのキャリッジリターン(外部プログラムによって挿入された)のため、Excelは文字列全体に引用符を追加していました。


4
引用符は、式内のCR / LFの結果(最後にある必要はありません)、またはこのスレッドの元の質問(char(9))のようなタブの場合もあります。
Turbo

あなたは私の人生を本当に楽にしてくれました
dE Source

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のセルにクリップボードを貼り付けると、次のように、疑問符が内側にある正方形で構成される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」からの@コメント:
はい、そうです。「問題:」というタイトルで始まる回答は誤解を招きます。変更:「 "user3616725"からの回答に関して考えられる問題:」。コメントとして、私は確かにはるかにコンパクトに書いたでしょう。


これは有効な回答として機能すると思います(ただし、[ 問題]で開始すると、新しい問題が発生したように見えます)。コメントの上限は600文字であるため、これは間違いなく長すぎます。
Teepeemm 2015年

素晴らしい!ありがとう!唯一の問題は、単一のセルに対してのみ機能することです。範囲をコピーできるように改善することはできますか?
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))を追加します。

注:セル内に埋め込まれている文字をコピーすることはできません。これは、そのセルを貼り付けているターゲットフィールドが終了する原因になります(つまり、アクセスまたは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標準に完全に準拠していることです(二重引用符文字は2つの二重引用符文字に置き換えられます)。

したがって、別のアプローチは、特にタブや改行が数式に起因する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は改行、タブなども
取り除き
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.