Excel VBA | 選択範囲のセルを結合してクリップボードにコピーするVBA

Excel VBA VBA
スポンサーリンク

では「Excelで選択したセルの値をすべて結合して、1行の文字列にまとめてクリップボードにコピーする」実践VBAサンプルを作ります。
これを使うと、例えば表の一部を簡単にテキストとして他アプリに貼り付けられます。


選択範囲のセルを結合してクリップボードにコピーするVBA

' 参照設定が不要な簡易クリップボードコピー版
' 標準モジュールに貼って使えます

Sub CopySelectionAsText()
    Dim rng As Range
    Dim cell As Range
    Dim result As String
    
    ' 選択範囲を取得
    Set rng = Selection
    
    ' 行単位で処理
    Dim r As Long, c As Long
    Dim rowCount As Long, colCount As Long
    rowCount = rng.Rows.Count
    colCount = rng.Columns.Count
    
    For r = 1 To rowCount
        For c = 1 To colCount
            result = result & rng.Cells(r, c).Value
            ' 列の間はカンマで区切る
            If c < colCount Then result = result & ", "
        Next c
        ' 行の最後は改行
        If r < rowCount Then result = result & vbCrLf
    Next r
    
    ' クリップボードにコピー
    Dim DataObj As Object
    Set DataObj = CreateObject("MSForms.DataObject")
    DataObj.SetText result
    DataObj.PutInClipboard
    
    MsgBox "選択範囲を文字列としてコピーしました。" & vbCrLf & _
           "内容はクリップボードにあります。"
End Sub
VB

使い方

  1. Excelでコピーしたいセル範囲を選択。
  2. VBAで上のマクロを実行(F5)。
  3. 選択範囲の内容が 1行ずつ改行、列は カンマ区切り でまとめられてクリップボードに入る。
  4. Ctrl+V で他アプリ(メモ帳やメールなど)に貼り付け可能。

ポイント・応用

  • result = result & rng.Cells(r, c).Value 部分を自由に変更して、文字列の前後に装飾をつけたり、タブ区切りに変えたりできる: result = result & "[" & rng.Cells(r, c).Value & "]"
  • 行末の改行を vbCrLf から vbTab に変えれば、1行にまとめたタブ区切りも可能。
  • 配列にまとめてから Join すると、大量セルの処理も高速化できる。

応用例:

  • Excelの表をそのままメール本文に貼りたいとき。
  • 複数シートのデータをまとめて1つの文字列にしてログやレポート用に加工。
  • CSV形式で簡単にコピーして他アプリに貼り付け。

ではさらに便利に、選択範囲を自由に区切り文字(タブ、カンマ、任意文字)で1行にまとめてクリップボードにコピーする高度版VBA を作ります。

' 高度版:選択範囲を1行にまとめてクリップボードにコピー
' 区切り文字を自由に変更可能
' 標準モジュールに貼って実行

Sub CopySelectionCustomDelimiter()
    Dim rng As Range
    Dim cell As Range
    Dim result As String
    Dim delimiter As String
    
    ' 区切り文字をユーザーに入力
    delimiter = InputBox("区切り文字を入力してください(例:カンマ, タブ, 空白など)", "区切り文字の指定", ", ")
    If delimiter = "" Then delimiter = ", " ' デフォルトはカンマ
    
    ' 選択範囲を取得
    Set rng = Selection
    
    Dim r As Long, c As Long
    Dim rowCount As Long, colCount As Long
    rowCount = rng.Rows.Count
    colCount = rng.Columns.Count
    
    ' 選択範囲の値を1行にまとめる
    For r = 1 To rowCount
        For c = 1 To colCount
            result = result & rng.Cells(r, c).Value
            ' 最後の列以外は区切り文字を追加
            If c < colCount Then result = result & delimiter
        Next c
        ' 行の間にスペースや改行を入れたければここで変更
        If r < rowCount Then result = result & vbCrLf
    Next r
    
    ' クリップボードにコピー
    Dim DataObj As Object
    Set DataObj = CreateObject("MSForms.DataObject")
    DataObj.SetText result
    DataObj.PutInClipboard
    
    MsgBox "選択範囲を1行にまとめてコピーしました。" & vbCrLf & _
           "区切り文字: """ & delimiter & """"
End Sub
VB

使い方

  1. Excelでコピーしたいセル範囲を選択。
  2. マクロを実行すると、区切り文字を入力するダイアログが表示される。
    • 例: , → カンマ区切り
    • \t または Tab → タブ区切り
    • 空白 " " もOK
  3. 選択範囲の内容が、指定した区切り文字で結合され、クリップボードにコピーされる。
  4. Ctrl+V で他アプリに貼り付け可能。

応用例・カスタマイズ

  • 改行の制御
    • 行ごとに改行を入れたくなければ、vbCrLf の部分を削除する。
  • 装飾の追加
    • 文字列を "[" & rng.Cells(r,c).Value & "]" のように囲むと、見やすい形式に。
  • 大量データの高速化
    • Variant 型の配列に一旦読み込み、Join で結合すると処理が高速化できる。
' 配列とJoinで高速化例(行単位でまとめる)
Dim arr() As Variant
arr = rng.Value ' 選択範囲を配列にコピー
Dim rowArr() As String
ReDim rowArr(1 To UBound(arr, 2))
For c = 1 To UBound(arr, 2)
    rowArr(c) = arr(1, c)
Next c
result = Join(rowArr, delimiter)
VB
  • 複数行をまとめて1行にするか、行ごとに改行を入れるかvbCrLf を挿入する位置で調整可能。

このマクロのメリット

  1. 表の一部を簡単にコピーして、メールやチャットに貼り付けられる。
  2. 区切り文字を自由に変えられるのでCSV作成やタブ区切りデータ作成にも最適。
  3. 文字列加工の応用に使える基礎ツールになる。
VBA
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました