VBAの勉強を始めてみた

タイトルの通りVBAの勉強を始めました。若干の発達障害があり、読みづらく分かりづらい点が多々あるかもしれませんが、ご了承下さい。

結合セルのデータを単一セルのデータと同じようにクリップボードに格納する

下の画像のような結合セルをコピーしてメモ帳などに貼り付けると・・・

f:id:kouten0430:20170707001604j:plain

f:id:kouten0430:20170707001701j:plain

このように、意図しない改行やTabがクリップボードに格納されていることが分かります。
これは、結合セルが複数セルで構成されているからであり、画像の例であれば一つの結合セルに9個のセルが含まれていることになります。9個のセルのうち値が入っているのは左上のセルのみで、残りの8個のセルは空っぽです。結合セルをコピーすると値に加えて9セル分のTab区切りと改行区切りがクリップボードに格納されてしまうのです。

しかし・・・・・・、結合セルを一つのセルのようにコピーしたいと思うのが人情ではないでしょうか?
ということで今回のマクロを組んでみました。結合セルを選択し通常の「コピー」ではなく今回のマクロを実行した場合は下のようにクリップボードに格納されます。

f:id:kouten0430:20170707001923j:plain

このように余分な改行やTabのない形でクリップボードに格納することができます。

 

その他、今回のマクロに下記の特徴があります。
・選択範囲の可視セルの値のみクリップボードに格納します
・選択したセルの順にクリップボードに格納されます
・セル内で改行がある場合の改行(改行コード:LF)もクリップボードに格納します。貼り付けの際にセル内改行を再現するには別途マクロを使う必要があります。今回のマクロと本記事末尾のリンク先にあるマクロを合わせて使うとより効果的です。
・単一セルでも問題なくクリップボードに格納されます

 


今回のマクロを使用するには、事前にVBEからMicrosoft Forms 2.0 Object Libraryを参照設定する必要があります。
(ツール→参照設定→参照からWindows\System32\FM20.DLLを選択)

 

***************************************

Sub 選択範囲のデータを改行区切りでクリップボードに格納()
    'Microsoft Forms 2.0 Object Libraryを参照設定して下さい
   
    Dim myRange As Range
    Dim V As String

    For Each myRange In Selection.SpecialCells(xlCellTypeVisible)   '可視セルのみに処理を行う
        If myRange.Address = myRange.MergeArea(1).Address Then   '結合セルの場合は左上の値のみ取り出す
            V = V & myRange.Value & vbCrLf
        End If
    Next myRange
   
    V = Left(V, Len(V) - 2) '最終行の改行区切りを取り除く(CrLfは2文字)
   
    With New MSForms.DataObject
        .SetText V  '変数の値をDataObjectに格納する
        .PutInClipboard 'DataObjectのデータをクリップボードに格納する
    End With

End Sub

***************************************

 ※SubからEnd Subまでをコピペしてマクロを使用できます。使用の際は自己責任でお願いいたします。

 

セル内改行を再現し、かつ結合セルにも貼り付けできるマクロ

kouten0430.hatenablog.com