t-hom’s diary

主にVBAネタを扱っているブログ…とも言えなくなってきたこの頃。

WordにVBAコードを張り付けると1行1段落になってしまう問題を回避するマクロ

今回の記事は、前回の記事を踏まえて書くので、未読の方はこちらもどうぞ。
thom.hateblo.jp

VBエディタからコードをコピーしてWordに張り付けると、次のように1行1段落になってしまう。
f:id:t-hom:20160124180827p:plain

段落間には余白がとられるため不自然に行間が広く開いてしまう。設定でなんとかできないこともない。しかし、段落とは普通、単体で読んだときにも成り立つ文章である。その意味を考えると、ソースコード等は1プロシージャで1段落にまとめてしまいたい。

そこで、次のようなWordマクロを作成した。

Sub 非改段落貼り付け()
    Dim CB As New DataObject
    CB.GetFromClipboard
    Dim T As String, p As Variant
    For Each p In Split(CB.GetText, vbCrLf)
         T = T & p & vbVerticalTab
    Next
    Selection.TypeText Text:=T
End Sub

このマクロを使うには、Microsoft Forms 2.0 Object Libraryを参照設定しておく必要がある。よくわからなければ、ユーザーフォームを追加すれば自動的に参照設定される。(作ったフォームは消しても良い。)

そして、VBEからWordに張り付けたいマクロをコピーして、Word上で張り付けたい位置にカーソルを移動させてからこのマクロを実行すると、以下のように1つの段落として張り付く。
f:id:t-hom:20160124182230p:plain

処理の中核部分は、Split(CB.GetText, vbCrLf)で、クリップボードの中身を改行で切り分けて単行に戻し、vbVerticalTabを末尾につけてTに結合しているところ。

vbVerticalTabはVBAの定数として用意されている垂直タブの制御コードである。
Wordの改行の内部コードはChr(11)。つまり、垂直タブの制御コードだったのだ。(さっき知った。)

わざわざ変数Tに結合しなくても、直接TypeTextすれば良いじゃないかと思うかもしれない。それでも貼り付け自体はうまくいく。
しかしWordのマクロが優れているのは、マクロで操作した内容もCtrl+Zで戻せる点である。ループ内で直接TypeTextしてしまうと、10行あったら10回Ctrl+Zしないといけない。このために、一度変数Tに結合してから最後に出力するように変更した。


ついでに先日書いたコードのシンタックスハイライトマクロを使って着色してみた。
f:id:t-hom:20160124182824p:plain

thom.hateblo.jp

最近ちょっとWordマクロの便利さが分かってきたかもしれない。

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。