セル内改行を含んだセルのダブルクォーテーションを除いたコピー
Excelで、Alt+Enterのセル内改行を含むセルをコピーしてテキストとして貼り付けた場合、 そのセルの内容の前後にダブルクォーテーション(")が付加される。
これはExcelの内容をそのまま貼り付けたい場合に不便だったので、 ダブルクォーテーションをつけずにコピーする機能を、VBAを用いて実現した。 処理の内容は、
- 選択された領域の文字列を連結(ダブルクォーテーションなし+セル内改行をCR + LFに置換)し、クリップボードにコピーするプロシージャ―を作成
- 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を押せばダブルクォーテーションを付与せずに文字列をクリップボードにコピーすることができた。