RCIE-ジャンクのコード屋

主に自分のためにコーディングのTIPSを蓄積しています。

VBA フォルダの全画像をWord文書に挿入 AddPicture

今回やりたいこと

たくさんある画像ファイルを、Word文書に取り込みたい。
大きすぎる画像ファイルの場合は、文書の横幅に合わせて縮小したい。

でも画像は100以上あるから、とんでもなく面倒だ……
そうだ、Word VBAで自動化しよう。

大まかな方針

  • すべてのJPGファイルを再帰的に取得する => Collectionに入れる
    • 文書の末尾に画像を取り込む
    • 文書の横幅より大きければ縮小する

コード

Option Explicit

Const S_フォルダパス = "C:\Temp" 'ここを変更

Public Sub 今回の処理()
	Dim sファイルパス
	For Each sファイルパス In 全JPGパスを取得(C_フォルダパス)
		Dim o図 As InlineShape
		Set o図 = 画像を文書末尾に挿入(sファイルパス)
		文書横幅に合わせて縮小 o図
		o図.LockAspectRatio = msoTrue '縦横比は固定しておく
	Next
End Sub

Public Function 全JPGパスを取得(sフォルダパス) As Collection
	Dim c As New Collection
	全JPGパスを再帰的に取得 _
		CreateObject("Scripting.FileSystemObject"), c, sフォルダパス
	Set 全JPGパスを取得 = c
End Function

Private Sub 全JPGパスを再帰的に取得(fso, c As Collection, sフォルダパス)
	Dim oフォルダ As Object
	Set oフォルダ = fso.GetFolder(sフォルダパス)
	Dim oファイル As Object
	For Each oファイル In oフォルダ.Files
		Dim s拡張子 As String
		s拡張子 = fso.GetExtensionName(oファイル.Path)
		Select Case UCase(s拡張子)
		Case "JPG", "JPEG"
			c.Add oファイル.Path
		End Select
	Next
	Dim o子フォルダ As Object
	For Each o子フォルダ In oフォルダ.SubFolders
		全JPGパスを再帰的に取得 fso, c, o子フォルダ.Path
	Next
End Sub

Private Function 画像を文書末尾に挿入(sファイルパス) As InlineShape
	Dim rg As Range
	Set rg = ActiveDocument.Bookmarks("\EndOfDoc").Range
	Set 画像を文書末尾に挿入 = rg.InlineShapes.AddPicture(sファイルパス)
End Function

Private Sub 文書横幅に合わせて縮小(o図 As InlineShape)
	Dim n版面幅 As Single
	n版面幅 = 版面幅を取得(o図)
	If o図.Width > n版面幅 Then
		o図.Width = n版面幅
		o図.Height = o図.Height * 版面幅を取得(o図) / o図.Width
	End If
End Sub

Private Function 版面幅を取得(o図 As InlineShape) As Single
	Dim nセクション番号 As Single
	nセクション番号 = o図.Range.Information(wdActiveEndSectionNumber)
	版面幅を取得 = _
		o図.Range.Parent.Sections(nセクション番号).PageSetup. _
		TextColmuns(1).Width
End Function