VBAで文書にインライン画像を挿入する(Word)

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を実行すると、当然、

f:id:akashi_keirin:20210807151631p:plain

こうなる。

実にめでたい。

画像の大きさを変えようとすると悲劇が起こる

しかし……。

f:id:akashi_keirin:20210807154319g:plain

これは全然だめである。

画像の書式を調べてみる。

f:id:akashi_keirin:20210807152008p:plain

なんと、デフォルトでは「縦横比を固定する」のチェックが外れているのである。なんでやねん。

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プロパティの値をイミディエイトに出力する。

結果は、

f:id:akashi_keirin:20210807151641p:plain

このとおり、「0」と出た。

オブジェクト ブラウザーで調べると、

f:id:akashi_keirin:20210807151645p:plain

LockAspectRatioプロパティはMsoTriState型。

同様にオブジェクト ブラウザーで調べると、MsoTriState列挙体のメンバは、

f:id:akashi_keirin:20210807151648p:plain

このとおり。

つまり、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にするのである!

実行結果

f:id:akashi_keirin:20210807153116g:plain

当然、画像の書式は、

f:id:akashi_keirin:20210807152012p:plain

このとおり、ちゃんと「縦横比を固定する」にチェックが入っている。

うむ、万全である!

おわりに

手動で動画を挿入すると、普通に「縦横比を固定する」にチェックが入っているものだから、ちょっと焦りましたよ。