VBAでテキストボックスのレイアウト設定を操作する
ことごとく「背面」になっているテキストボックスェ……
業務で引き継いだWordドキュメントがカオス……
業務でWordドキュメントを引き継いだ。
で、そのWordドキュメントってのがひどいやつで、
40個ぐらい配置されているテキストボックスのレイアウトがことごとく「背面」
なのだった……。
しかも、そのテキストボックスの中身を書き換えたり、位置を動かしたりしないといけないんだが、
「背面」になっているテキストボックスって、そもそもマウスで選択することすら難しい。
画面右上の「選択」から「オブジェクトの選択」ってのを選ばないと、なかなか選択できなくていらいらする。
こんなのが何十個もあるとか、軽い拷問ですよね。
テキストボックスの「折り返しの種類」をVBAで操作する
「テキストボックスの書式設定」の「レイアウト」タブにある「行内」とか「前面」とかは「折り返しの種類」っていうのね。知らんかった。まあ、Word初心者だしな。
この「折り返しの種類」は、 WrapFormatプロパティというらしい。
オブジェクトの階層をたどると、
Documentオブジェクト→Shapesコレクション→Shapeオブジェクト→WrapFormatオブジェクト→Typeプロパティ
となるのかな。
要するに、コーディング的には、テキストボックスオブジェクトを取得して、そのWrapFormat.Typeプロパティが「前面」になっていなかったら「前面」に変える、というだけで良い。
コーディング
標準モジュールに次のコードを書く。
リスト1 標準モジュール
Public Sub frontizeTextBox() Dim objDoc As Document Set objDoc = ActiveDocument Dim shp As Word.Shape For Each shp In objDoc.Shapes '……(1)' With shp.WrapFormat '……(2)' If shp.Type = msoTextBox Then '……(3)' If .Type <> wdWrapFront Then .Type = wdWrapFront '……(4)' End If End With Next End Sub
プロシージャ名の「frontize」ってのはたぶん存在しない英単語だろうねえ。メンドクサイからテキトーに書いたw
それはさておき、まずは、(1)の
For Each shp In objDoc.Shapes
「shp」ってのはShape型のオブジェクト変数で、オートシェイプ(今はそんな呼び方しないんだっけ?)をぶち込むための変数。Shapesコレクションの要素をぶち込んでFor Eachで回していくわけだ。
(2)の
With shp.WrapFormat
では、WrapFormatオブジェクトへの参照や操作が多いのでWithでまとめている。
(3)の
If shp.Type = msoTextBox Then
でshpの中身を調べ、テキストボックスである場合だけ次の処理に進む。
で、shpがテキストボックスだった場合は、(4)の
If .Type <> wdWrapFront Then .Type = wdWrapFront
に進む。
WrapFormatオブジェクトのTypeプロパティがwdWrapFrontでなかったら、wdWrapFrontにする。
ちなみに、wdWrapFrontの正体は
この通り、「3」です。
実行結果
実行前
「折り返しの種類」は「背面」。
実行後
「折り返しの種類」が「前面」になった。
おわりに
たまに、図形の類をベタベタ貼り付けたドキュメントに出くわす。で、それらの設定がことごとくデタラメ、という場面もちょいちょいあるような気がする。そんなとき、VBAで図形を操作する方法を知っていれば便利かも。
まあ、それ以前にもう少しマトモなOfficeの使い方してくれよ……とは思いますが。
ついでに……
オブジェクトブラウザーを使うと、組み込み定数(っていうか、列挙体のメンバ)を調べることができて便利。
コチラは、WdWrapType列挙体のメンバ。名前を見たらだいたい何を意味するのか見当がつくと思います。