Excel VBAを使って、業務に役立つ自動化を実現したいとお考えの皆様、こんにちは!ベテランExcel VBA講師の〇〇です。今回は、多くのビジネスシーンで役立つ「画像ファイルの挿入」に焦点を当て、Excel VBAでどのように実現できるのか、その具体的な方法と応用テクニックを徹底解説します。
「請求書に会社のロゴを入れたい」「報告書にグラフの画像を貼り付けたい」「商品カタログに商品画像を並べたい」といったニーズは、Excelを日常的に利用する方なら一度は経験したことがあるのではないでしょうか。手作業で一つ一つ画像ファイルを挿入するのは、時間も手間もかかります。しかし、VBAを使えば、これらの作業を驚くほど効率化できます。
本記事では、Excel VBAの基本的な画像挿入方法から、より実践的な応用テクニックまで、初心者の方でも理解できるよう丁寧に解説していきます。ぜひ最後までお付き合いください。
### 1. Excel VBAで画像を挿入する基本
まず、Excel VBAで画像を挿入する最も基本的な方法から見ていきましょう。
#### 1.1 `Shapes.AddPicture` メソッドの利用
Excel VBAで画像ファイルを挿入する際に最も一般的に利用されるのが、`Shapes`コレクションの`AddPicture`メソッドです。このメソッドは、指定したパスにある画像ファイルをワークシート上に図形オブジェクトとして挿入します。
構文は以下の通りです。
Shapes.AddPicture(FileName, LinkToFile, SaveWithDocument, Left, Top, Width, Height)
各引数の説明は以下の通りです。
* **FileName**: 挿入したい画像ファイルのフルパスを指定します。
* **LinkToFile**: 画像ファイルをリンクとして挿入するかどうかを指定します。
* `msoFalse` (0): 画像をワークシートに埋め込みます。ファイルサイズは大きくなりますが、元の画像ファイルがなくても表示されます。
* `msoTrue` (1): 画像ファイルをリンクします。元の画像ファイルへの参照が保存され、ファイルサイズは小さくなりますが、元の画像ファイルがないと表示できません。
* **SaveWithDocument**: `LinkToFile`が`msoTrue`の場合に、画像ファイルをドキュメントと一緒に保存するかどうかを指定します。
* `msoFalse` (0): ドキュメントと一緒に保存しません。
* `msoTrue` (1): ドキュメントと一緒に保存します。(通常は`msoFalse`で十分です)
* **Left**: 画像の左端のX座標(左からの距離)を指定します。Excelの標準単位(ポイント)で指定します。
* **Top**: 画像の上端のY座標(上からの距離)を指定します。Excelの標準単位(ポイント)で指定します。
* **Width**: 画像の幅を指定します。Excelの標準単位(ポイント)で指定します。省略または-1を指定すると、元の画像の幅が使用されます。
* **Height**: 画像の高さを指定します。Excelの標準単位(ポイント)で指定します。省略または-1を指定すると、元の画像の高さが使用されます。
#### 1.2 具体的なコード例
それでは、実際にコードを書いてみましょう。ここでは、Cドライブ直下にある「logo.png」という画像を、アクティブシートのA1セルを基準に挿入する例を示します。
Sub InsertImageBasic()
Dim ws As Worksheet
Dim imagePath As String
Dim leftPos As Double
Dim topPos As Double
‘ アクティブシートを取得
Set ws = ThisWorkbook.ActiveSheet
‘ 挿入したい画像ファイルのパスを指定
imagePath = “C:\logo.png” ‘ ご自身の環境に合わせてパスを変更してください
‘ 画像の挿入位置(左上隅)を指定(A1セルの左上を基準とする)
‘ セルの左上隅の座標を取得するには、RangeオブジェクトのLeftプロパティとTopプロパティを使用します。
leftPos = ws.Range(“A1”).Left
topPos = ws.Range(“A1”).Top
‘ 画像を挿入(埋め込み、元のサイズで挿入)
On Error Resume Next ‘ ファイルが存在しない場合のエラーを回避
ws.Shapes.AddPicture Filename:=imagePath, _
LinkToFile:=msoFalse, _
SaveWithDocument:=msoFalse, _
Left:=leftPos, _
Top:=topPos, _
Width:=-1, _
Height:=-1
On Error GoTo 0 ‘ エラーハンドリングを元に戻す
‘ ファイルが存在しない場合のエラーメッセージ表示
If Err.Number <> 0 Then
MsgBox “指定された画像ファイルが見つかりません。” & vbCrLf & imagePath, vbExclamation
Err.Clear
End If
End Sub
**コードの解説:**
1. `Dim ws As Worksheet`: ワークシートオブジェクトを宣言します。
2. `Dim imagePath As String`: 画像ファイルのパスを格納する変数を宣言します。
3. `Dim leftPos As Double, topPos As Double`: 画像の挿入位置を格納する変数を宣言します。
4. `Set ws = ThisWorkbook.ActiveSheet`: 現在アクティブなシートを`ws`変数にセットします。
5. `imagePath = “C:\logo.png”`: 挿入したい画像ファイルのパスを指定します。**ご自身の環境に合わせて、このパスは必ず変更してください。**
6. `leftPos = ws.Range(“A1”).Left`: `A1`セルの左端のX座標を取得し、`leftPos`変数に格納します。
7. `topPos = ws.Range(“A1”).Top`: `A1`セルの上端のY座標を取得し、`topPos`変数に格納します。
8. `ws.Shapes.AddPicture …`: `AddPicture`メソッドを使って画像を挿入します。
* `Filename:=imagePath`: 挿入する画像ファイルのパスを指定します。
* `LinkToFile:=msoFalse`: 画像をワークシートに埋め込みます。
* `SaveWithDocument:=msoFalse`: ドキュメントと一緒に保存しません。
* `Left:=leftPos, Top:=topPos`: `A1`セルの左上を基準に挿入します。
* `Width:=-1, Height:=-1`: 元の画像のサイズをそのまま使用します。
9. `On Error Resume Next` / `On Error GoTo 0`: `AddPicture`メソッドは、指定したパスにファイルが存在しない場合にエラーが発生します。このエラーハンドリングにより、プログラムが停止するのを防ぎ、後でエラーメッセージを表示するようにしています。
### 2. 画像のサイズや位置を調整するテクニック
基本を理解したら、次は挿入した画像のサイズや位置をより柔軟に調整する方法を学びましょう。
#### 2.1 サイズの指定
`AddPicture`メソッドの`Width`と`Height`引数で、挿入時のサイズを指定できます。
**例:幅を100ポイント、高さを自動調整して挿入**
Sub InsertImageWithSize()
Dim ws As Worksheet
Dim imagePath As String
Set ws = ThisWorkbook.ActiveSheet
imagePath = “C:\logo.png” ‘ ご自身の環境に合わせてパスを変更してください
‘ 画像を挿入(幅を100ポイントに指定、高さは自動調整)
On Error Resume Next
ws.Shapes.AddPicture Filename:=imagePath, _
LinkToFile:=msoFalse, _
SaveWithDocument:=msoFalse, _
Left:=ws.Range(“B2”).Left, _
Top:=ws.Range(“B2”).Top, _
Width:=100, _
Height:=-1 ‘ 高さは自動調整
On Error GoTo 0
If Err.Number <> 0 Then
MsgBox “指定された画像ファイルが見つかりません。” & vbCrLf & imagePath, vbExclamation
Err.Clear
End If
End Sub
このコードでは、`Width:=100`と指定することで、画像の幅を100ポイントに設定しています。`Height:=-1`とすることで、アスペクト比を維持したまま高さが自動的に計算されます。
#### 2.2 セルに合わせてサイズ調整
挿入した画像を特定のセルに合わせてリサイズしたい場合もよくあります。以下のコードは、指定したセル(例: `C3`)の幅と高さに画像サイズを合わせる例です。
Sub ResizeImageToCell()
Dim ws As Worksheet
Dim img As Shape
Dim targetCell As Range
Dim cellWidth As Double
Dim cellHeight As Double
Set ws = ThisWorkbook.ActiveSheet
‘ 対象となるセルを設定
Set targetCell = ws.Range(“C3”)
‘ ワークシート上に存在する画像オブジェクトを取得(ここでは一番最初に挿入された画像を想定)
‘ 実際には、挿入時に変数に格納しておくのが一般的です。
On Error Resume Next
Set img = ws.Shapes(ws.Shapes.Count) ‘ 最後に挿入された画像を取得
On Error GoTo 0
If img Is Nothing Then
MsgBox “ワークシート上に画像が見つかりません。”, vbExclamation
Exit Sub
End If
‘ 対象セルの幅と高さを取得
cellWidth = targetCell.Width
cellHeight = targetCell.Height
‘ 画像のサイズをセルに合わせる(アスペクト比を維持)
‘ 画像の元の縦横比を計算
Dim aspectRatio As Double
aspectRatio = img.Width / img.Height
‘ セルの縦横比と画像の縦横比を比較し、どちらかに合わせる
If cellWidth / cellHeight > aspectRatio Then
‘ セルの幅が狭すぎる場合、高さを基準にリサイズ
img.Height = cellHeight
img.Width = cellHeight * aspectRatio
Else
‘ セルの高さが狭すぎる場合、幅を基準にリサイズ
img.Width = cellWidth
img.Height = cellWidth / aspectRatio
End If
‘ 画像の位置をセルの左上に移動
img.Left = targetCell.Left
img.Top = targetCell.Top
End Sub
**コードの解説:**
1. `Set img = ws.Shapes(ws.Shapes.Count)`: 最後に挿入された画像オブジェクトを取得しています。もし複数の画像がある場合は、挿入時に`Set img = ws.Shapes.AddPicture(…)`のように変数に格納しておくことをお勧めします。
2. `cellWidth = targetCell.Width`, `cellHeight = targetCell.Height`: 対象セルの幅と高さを取得します。
3. `aspectRatio = img.Width / img.Height`: 画像の元の縦横比を計算します。
4. `If cellWidth / cellHeight > aspectRatio Then … Else …`: セルの縦横比と画像の縦横比を比較し、どちらかの辺に合わせてリサイズすることで、アスペクト比を維持したままセルに収まるように調整しています。
5. `img.Left = targetCell.Left`, `img.Top = targetCell.Top`: 画像の左上を対象セルの左上に移動させます。
#### 2.3 画像を移動させる
挿入した画像の`Left`プロパティと`Top`プロパティを変更することで、位置を移動させることができます。
**例:画像をA5セルの中央に配置**
Sub MoveImageToCenterOfCell()
Dim ws As Worksheet
Dim img As Shape
Dim targetCell As Range
Set ws = ThisWorkbook.ActiveSheet
Set targetCell = ws.Range(“A5”)
‘ ワークシート上に存在する画像オブジェクトを取得(ここでは一番最初に挿入された画像を想定)
On Error Resume Next
Set img = ws.Shapes(1) ‘ 最初の画像を取得
On Error GoTo 0
If img Is Nothing Then
MsgBox “ワークシート上に画像が見つかりません。”, vbExclamation
Exit Sub
End If
‘ 画像をセルの左上に配置
img.Left = targetCell.Left
img.Top = targetCell.Top
‘ 画像のサイズをセルのサイズに合わせる(アスペクト比維持)
Dim aspectRatio As Double
aspectRatio = img.Width / img.Height
If targetCell.Width / targetCell.Height > aspectRatio Then
img.Height = targetCell.Height
img.Width = targetCell.Height * aspectRatio
Else
img.Width = targetCell.Width
img.Height = targetCell.Width / aspectRatio
End If
‘ 画像をセルの中心に移動させる
img.Left = targetCell.Left + (targetCell.Width – img.Width) / 2
img.Top = targetCell.Top + (targetCell.Height – img.Height) / 2
End Sub
このコードでは、まず画像をセルの左上に配置し、セルのサイズに合わせてリサイズした後、セルの中央に配置するための計算を行っています。
### 3. 複数の画像を効率的に挿入する
単一の画像を挿入するだけでなく、複数の画像をまとめて挿入したい場合も多いでしょう。
#### 3.1 指定したフォルダ内の全画像を挿入
特定のフォルダにあるすべての画像ファイルを、順番にワークシート上に挿入するコードです。
Sub InsertAllImagesFromFolder()
Dim ws As Worksheet
Dim folderPath As String
Dim fileName As String
Dim leftPos As Double
Dim topPos As Double
Dim currentRow As Long
Set ws = ThisWorkbook.ActiveSheet
folderPath = “C:\Images\” ‘ 画像が保存されているフォルダパスを指定してください
‘ フォルダパスの末尾に “\” がない場合は追加
If Right(folderPath, 1) <> “\” Then
folderPath = folderPath & “\”
End If
‘ 最初の画像挿入位置を指定(例: A1セルから開始)
leftPos = ws.Range(“A1”).Left
topPos = ws.Range(“A1”).Top
currentRow = 1 ‘ 行番号
‘ フォルダ内の最初のファイル名を取得
fileName = Dir(folderPath & “*.jpg”) ‘ JPGファイルの場合。*.png, *.gif なども指定可能
‘ ファイルが見つかる限りループ
Do While fileName <> “”
‘ 画像を挿入
On Error Resume Next
ws.Shapes.AddPicture Filename:=folderPath & fileName, _
LinkToFile:=msoFalse, _
SaveWithDocument:=msoFalse, _
Left:=leftPos, _
Top:=ws.Cells(currentRow, 1).Top, _
Width:=-1, _
Height:=-1
On Error GoTo 0
If Err.Number <> 0 Then
MsgBox “画像ファイルの挿入中にエラーが発生しました: ” & folderPath & fileName, vbExclamation
Err.Clear
Else
‘ 次の行に移動
currentRow = currentRow + 1
End If
‘ 次のファイル名を取得
fileName = Dir
Loop
MsgBox “フォルダ内の画像挿入が完了しました。”, vbInformation
End Sub
**コードの解説:**
1. `folderPath = “C:\Images\”`: 画像ファイルが保存されているフォルダのパスを指定します。
2. `fileName = Dir(folderPath & “*.jpg”)`: `Dir`関数を使って、指定したフォルダにある最初のJPGファイルの名前を取得します。拡張子を変えれば、PNGやGIFなど他の形式の画像も指定できます。複数の拡張子を指定したい場合は、`Dir(folderPath & “*.jpg”)`の後に`fileName = Dir()`を再度実行し、`fileName <> “*.jpg” And fileName <> “*.png”`のように条件分岐で処理する必要があります。
3. `Do While fileName <> “” … Loop`: `Dir`関数は、ファイルが見つからなくなると空文字列を返します。このループで、フォルダ内のすべてのファイル名を順番に取得します。
4. `ws.Cells(currentRow, 1).Top`: 画像の挿入位置を、現在の行の先頭セル(1列目)の上端に設定します。
5. `currentRow = currentRow + 1`: 画像を挿入するたびに、次の行に移動するように行番号をインクリメントします。
#### 3.2 ファイル選択ダイアログを表示して画像を選択
ユーザーに挿入したい画像ファイルを自分で選んでもらいたい場合、ファイル選択ダイアログを表示するのが便利です。
Sub InsertImageWithFileDialog()
Dim ws As Worksheet
Dim fd As FileDialog
Dim selectedFile As Variant
Dim leftPos As Double
Dim topPos As Double
Set ws = ThisWorkbook.ActiveSheet
‘ FileDialogオブジェクトを作成
Set fd = Application.FileDialog(msoFileDialogFilePicker)
‘ ダイアログの設定
With fd
.Title = “挿入する画像ファイルを選択してください”
.AllowMultiSelect = False ‘ 複数選択を許可しない
.Filters.Clear
.Filters.Add “画像ファイル”, “*.jpg;*.jpeg;*.png;*.gif;*.bmp” ‘ 選択可能なファイルの種類
‘ .InitialFileName = “C:\” ‘ 初期フォルダを指定する場合
‘ ダイアログを表示し、ファイルが選択されたか確認
If .Show = -1 Then ‘ -1は「OK」がクリックされた場合
‘ 選択されたファイルのパスを取得
selectedFile = .SelectedItems(1)
‘ 画像の挿入位置を指定(例: A1セルを基準)
leftPos = ws.Range(“A1”).Left
topPos = ws.Range(“A1”).Top
‘ 画像を挿入
On Error Resume Next
ws.Shapes.AddPicture Filename:=selectedFile, _
LinkToFile:=msoFalse, _
SaveWithDocument:=msoFalse, _
Left:=leftPos, _
Top:=topPos, _
Width:=-1, _
Height:=-1
On Error GoTo 0
If Err.Number <> 0 Then
MsgBox “画像ファイルの挿入中にエラーが発生しました。” & vbCrLf & selectedFile, vbExclamation
Err.Clear
End If
Else
MsgBox “ファイルは選択されませんでした。”, vbInformation
End If
End With
‘ オブジェクトの解放
Set fd = Nothing
End Sub
**コードの解説:**
1. `Set fd = Application.FileDialog(msoFileDialogFilePicker)`: ファイル選択ダイアログオブジェクトを作成します。
2. `.Title`, `.AllowMultiSelect`, `.Filters`: ダイアログのタイトル、複数選択の可否、表示するファイルの種類を設定します。
3. `If .Show = -1 Then`: ダイアログを表示し、ユーザーが「OK」ボタンをクリックしたかどうかを判定します。
4. `selectedFile = .SelectedItems(1)`: 選択されたファイルのパスを取得します。`.AllowMultiSelect = False`なので、常に1つ目の要素(`[1]`)が選択されたファイルです。
5. 取得したパスを使って、`AddPicture`メソッドで画像を挿入します。
### 4. 画像を操作する応用テクニック
挿入した画像をさらに便利に活用するための応用テクニックを紹介します。
#### 4.1 画像の削除
不要になった画像を削除したい場合、`Shapes`コレクションから削除します。
**例:A1セルにある画像を削除**
Sub DeleteImageAtA1()
Dim ws As Worksheet
Dim sh As Shape
Dim targetCell As Range
Set ws = ThisWorkbook.ActiveSheet
Set targetCell = ws.Range(“A1″)
‘ 指定したセルに重なっている図形オブジェクトを検索
For Each sh In ws.Shapes
‘ 図形がセルと重なっているか判定(簡易的な判定)
‘ より正確には、図形のLeft, Top, Width, HeightとセルのLeft, Top, Width, Heightを比較します。
If sh.TopLeftCell.Address = targetCell.Address Then
sh.Delete
MsgBox targetCell.Address & ” の画像(図形)を削除しました。”, vbInformation
Exit Sub ‘ 最初に見つかったものを削除したら終了
End If
Next sh
MsgBox targetCell.Address & ” に画像(図形)は見つかりませんでした。”, vbInformation
End Sub
**注意点:** このコードは、画像がセルの左上隅と一致する場合に削除しています。実際には、画像がセルに重なっているかどうかをより正確に判定する必要があります。`sh.TopLeftCell`プロパティは、図形の左上隅がどのセルにあるかを示します。
#### 4.2 画像を透かし(ウォーターマーク)として挿入する
会社のロゴなどを透かしとして表示したい場合、画像の透明度を設定します。
Sub InsertWatermark()
Dim ws As Worksheet
Dim img As Shape
Dim imagePath As String
Dim leftPos As Double
Dim topPos As Double
Set ws = ThisWorkbook.ActiveSheet
imagePath = “C:\logo.png” ‘ ご自身の環境に合わせてパスを変更してください
‘ 画像を挿入(一旦、元のサイズで左上に配置)
On Error Resume Next
Set img = ws.Shapes.AddPicture(Filename:=imagePath, _
LinkToFile:=msoFalse, _
SaveWithDocument:=msoFalse, _
Left:=ws.Range(“A1”).Left, _
Top:=ws.Range(“A1”).Top, _
Width:=-1, _
Height:=-1)
On Error GoTo 0
If img Is Nothing Then
MsgBox “画像ファイルの挿入に失敗しました。” & vbCrLf & imagePath, vbExclamation
Exit Sub
End If
‘ 画像全体をワークシートのサイズに合わせる
img.ScaleHeight 1, msoTrue ‘
