VBAでテキストボックスのレイアウト設定を操作する


ことごとく「背面」になっているテキストボックスェ……

業務で引き継いだWordドキュメントがカオス……

業務でWordドキュメントを引き継いだ。

で、そのWordドキュメントってのがひどいやつで、

40個ぐらい配置されているテキストボックスのレイアウトがことごとく「背面」

なのだった……。

しかも、そのテキストボックスの中身を書き換えたり、位置を動かしたりしないといけないんだが、

f:id:akashi_keirin:20171125210411j:plain

「背面」になっているテキストボックスって、そもそもマウスで選択することすら難しい。

画面右上の「選択」から「オブジェクトの選択」ってのを選ばないと、なかなか選択できなくていらいらする。

こんなのが何十個もあるとか、軽い拷問ですよね。

テキストボックスの「折り返しの種類」を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の正体は

f:id:akashi_keirin:20171125210625j:plain

この通り、「3」です。

実行結果

実行前

f:id:akashi_keirin:20171125210445j:plain

「折り返しの種類」は「背面」。

実行後

f:id:akashi_keirin:20171125210455j:plain

「折り返しの種類」が「前面」になった。

おわりに

たまに、図形の類をベタベタ貼り付けたドキュメントに出くわす。で、それらの設定がことごとくデタラメ、という場面もちょいちょいあるような気がする。そんなとき、VBAで図形を操作する方法を知っていれば便利かも。

まあ、それ以前にもう少しマトモなOfficeの使い方してくれよ……とは思いますが。

@akashi_keirin on Twitter

ついでに……

オブジェクトブラウザーを使うと、組み込み定数(っていうか、列挙体のメンバ)を調べることができて便利。

f:id:akashi_keirin:20171125211051j:plain

コチラは、WdWrapType列挙体のメンバ。名前を見たらだいたい何を意味するのか見当がつくと思います。