takecの気まぐれブログ

プログラミング等の話題を気まぐれに

セル内改行を含んだセルのダブルクォーテーションを除いたコピー

Excelで、Alt+Enterのセル内改行を含むセルをコピーしてテキストとして貼り付けた場合、 そのセルの内容の前後にダブルクォーテーション(")が付加される。

これはExcelの内容をそのまま貼り付けたい場合に不便だったので、 ダブルクォーテーションをつけずにコピーする機能を、VBAを用いて実現した。 処理の内容は、

  1. 選択された領域の文字列を連結(ダブルクォーテーションなし+セル内改行をCR + LFに置換)し、クリップボードにコピーするプロシージャ―を作成
  2. Shift + Ctrl + C にプロシージャ―を割り当て

とシンプルなものである。

全てのブックで機能を有効化するため、 個人用マクロブック(PERSONAL.XLSB)にVBAを記載する。

選択領域の文字列を連結してクリップボードにコピーするプロシージャ―を標準モジュールに定義

Public Sub MyTextCopy()
    Dim myDO As New DataObject
    Dim r As Range
    Dim str As String
    Dim i As Long, j As Long
    Const rowDelimiter As String = vbCrLf       ' 行区切り文字
    Const columnDelimiter As String = vbTab     ' 列区切り文字
    
    
    ' ステータスバーをクリア
    Application.StatusBar = ""
    
    ' Range以外(グラフ等)が選択されていたら処理しない
    If TypeName(Selection) <> "Range" Then
        Application.StatusBar = "Rangeではないためコピーしませんでした。"
        Exit Sub
    End If

    ' 選択領域を取得
    Set r = Selection
    
    str = ""
    
    For i = 1 To r.Rows.Count
        If i <> 1 Then
            str = str & rowDelimiter  ' 2行目以降は行区切り文字を挿入
        End If
        
        For j = 1 To r.Columns.Count
            If j <> 1 Then
                str = str & columnDelimiter   ' 2列目以降は列区切り文字を挿入
            End If
            str = str & Replace(r(i, j).Text, vbLf, vbCrLf)
        Next j
    Next i
    
    myDO.SetText str        'ClipBoardに文字列をコピーするために、DataObjectにSet
    myDO.PutInClipboard     'ClipBoardに文字列をコピー
    
    Application.StatusBar = "選択された領域をClipboardにコピーしました。"
End Sub

グラフ等を選択されていた場合は文字列として連結できないため、処理を行わない。 セル範囲が選択されていた場合はRangeオブジェクトとなるので処理を行う。 表示された文字列をそのままコピーするために、Textプロパティでセルの文字列を取得し、 メモ帳等でも改行が反映されるようにLFをCR+LFに置換し、行と列にそれぞれ区切り文字として改行とタブを挿入している。

Excelを起動した際にキーを割り当てるため、ThisWorkbookに、次のイベントプロシージャ―を定義

Private Sub Workbook_Open()
    Application.OnKey "^C", "MyTextCopy"
End Sub

これで、領域を選択してShift + Ctrl + Cを押せばダブルクォーテーションを付与せずに文字列をクリップボードにコピーすることができた。