今回の記事は、前回の記事を踏まえて書くので、未読の方はこちらもどうぞ。
thom.hateblo.jp
VBエディタからコードをコピーしてWordに張り付けると、次のように1行1段落になってしまう。
段落間には余白がとられるため不自然に行間が広く開いてしまう。設定でなんとかできないこともない。しかし、段落とは普通、単体で読んだときにも成り立つ文章である。その意味を考えると、ソースコード等は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つの段落として張り付く。
処理の中核部分は、Split(CB.GetText, vbCrLf)で、クリップボードの中身を改行で切り分けて単行に戻し、vbVerticalTabを末尾につけてTに結合しているところ。
vbVerticalTabはVBAの定数として用意されている垂直タブの制御コードである。
Wordの改行の内部コードはChr(11)。つまり、垂直タブの制御コードだったのだ。(さっき知った。)
わざわざ変数Tに結合しなくても、直接TypeTextすれば良いじゃないかと思うかもしれない。それでも貼り付け自体はうまくいく。
しかしWordのマクロが優れているのは、マクロで操作した内容もCtrl+Zで戻せる点である。ループ内で直接TypeTextしてしまうと、10行あったら10回Ctrl+Zしないといけない。このために、一度変数Tに結合してから最後に出力するように変更した。
ついでに先日書いたコードのシンタックスハイライトマクロを使って着色してみた。
最近ちょっとWordマクロの便利さが分かってきたかもしれない。