web-dev-qa-db-ja.com

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

問題
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."

これらの二重引用符が表示されないようにする方法別のプログラムにコピーするときつまり、セルがクリップボードにコピーされたときにこれらが自動的に追加されないようにすることはできますか?

77
Aaron Thomas

ワードパッド、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が見つからない場合は、試すことができます

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

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

71
Greg Smalter

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

22
Jonathan Wilson

複数セル​​を選択し、それらの値をクリップボードにすべての迷惑な引用符なしでコピーしたい場合、次のコードが役に立つかもしれません。これは、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
5
Peter Smallwood

引用符の問題に出くわしたときの解決策は、セルのテキストの末尾から改行を削除することでした。これらの復帰(外部プログラムによって挿入される)のため、Excelは文字列全体に引用符を追加していました。

4
martiangoblin

「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」からの回答に関連して考えられる問題:」に変更されました。コメントとして、私は確かにはるかにコンパクトに書いていただろう。

3
SourceSeeker

multipleを選択し、それらの迷惑な引用符なしでセルに値をクリップボードにコピーする場合」(without 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
1
Tom

以下の式を使用してください

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

そして、あなたはあなたが望むものを手に入れるでしょう;-)

0

結果を「クリーン」機能に配置することにより、これらの二重引用符を削除することもできます。

例:= CLEAN( "1"&CHAR(9)& "行1の注意事項"&CHAR(9)& "2"&CHAR(9)& "行2の注意事項")

出力は、Notepad ++などの他のプログラムに二重引用符なしで貼り付けられます。

0
Yuri Antelo

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
JoshInDC

メモ帳に貼り付けるときに改行を保持するには、マクロの次の行を置き換えます。

strTemp = ActiveCell.Value

によって:

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