VBAで文書に画像を挿入するときの注意
最近、Wordでマニュアルとか手順書の類を作成することがやたら増えた。
PDF配布を前提とすると、画像をふんだんに盛り込むことができるので、非常に良いのだが、当然画像の挿入が非常にめんどくさくなってくる。
そこで、VBAで画像挿入を楽にできるようにしようとした。
そのときに、ちょっと予定外のことが起こったので、報告。
カーソル位置にインライン画像を挿入するマクロ
まずは、カーソル位置にインライン画像を挿入するマクロ。
ドキュメントのあるフォルダ内に、「img」というフォルダがあり、その中に「アホの坂田.png」という画像ファイルがあるとする。
リスト1
Private Sub test01() Dim imgPath As String imgPath = ThisDocument.Path & "\img\アホの坂田.png" Dim ilShp As InlineShape Set ilShp = Selection.Range.InlineShapes.AddPicture(imgPath) Call ilShp.Select End Sub
カーソル位置のRangeオブジェクトのInlineShapesプロパティからInlineShapesコレクションオブジェクトを取得し、そのAddPictureメソッドにより、画像を挿入する。
AddPictureメソッドの返り値はInlineShapeオブジェクトなので、InlineShape型の変数ilShpで受け取り、最後にSelectメソッドを実行して、挿入した画像を選択状態にするようにしている。
リスト1を実行すると、当然、

こうなる。
実にめでたい。
画像の大きさを変えようとすると悲劇が起こる
しかし……。

これは全然だめである。
画像の書式を調べてみる。

なんと、デフォルトでは「縦横比を固定する」のチェックが外れているのである。なんでやねん。
LockAspectRatioプロパティ
画像の縦横比の固定を司るのは、[InlineShape].LockAspectRatioプロパティである。
画像を挿入するマクロ、リスト1を、次のように変えて実行してみる。
リスト2
Private Sub test01() Dim imgPath As String imgPath = ThisDocument.Path & "\img\アホの坂田.png" Dim ilShp As InlineShape Set ilShp = Selection.Range.InlineShapes.AddPicture(imgPath) Call ilShp.Select Debug.Print ilShp.LockAspectRatio End Sub
画像挿入直後のLockAspectRatioプロパティの値をイミディエイトに出力する。
結果は、

このとおり、「0」と出た。
オブジェクト ブラウザーで調べると、

LockAspectRatioプロパティはMsoTriState型。
同様にオブジェクト ブラウザーで調べると、MsoTriState列挙体のメンバは、

このとおり。
つまり、LockAspectRatioプロパティのデフォルト値はmsoFalseだとわかる。
これは、タンザニアのイカンガーである。
コードの修正
そこで、リスト1を次のように書き換える。
リスト3
Private Sub test01() Dim imgPath As String imgPath = ThisDocument.Path & "\img\アホの坂田.png" Dim ilShp As InlineShape Set ilShp = Selection.Range.InlineShapes.AddPicture(imgPath) ilShp.LockAspectRatio = msoTrue Call ilShp.Select End Sub
画像を挿入するや否や、LockAspectRatioプロパティの値をmsoTrueにするのである!
実行結果

当然、画像の書式は、

このとおり、ちゃんと「縦横比を固定する」にチェックが入っている。
うむ、万全である!
おわりに
手動で動画を挿入すると、普通に「縦横比を固定する」にチェックが入っているものだから、ちょっと焦りましたよ。