エクセルで写真の貼り付けを自動化するマクロ【すぐに使えるサンプル付】
エクセルに大量の写真をまとめて貼り付けたい!
こんな要望にエクセルマクロを使ってお応えします。
この記事で紹介している写真を貼り付けるマクロがこちら
①いつも通り写真をフォルダに保存
↓
②フォルダの保存場所を記入
↓
③実行ボタンを押下
たったの3Stepで大量の写真をまとめてエクセルに貼り付けることが可能となります。
- 今まで1時間以上かかっていたのに数分で処理できるようになった
- 大きさ、配置が自動的に調整されるのでキレイな資料を作れるようになった
- 写真付の資料作成が楽になった

ガッツポーズの人
この記事では、写真を貼り付けるマクロの導入方法、使い方、ダウンロードの方法を紹介しています。
よくエクセルに写真を貼り付ける作業をしている!という方は是非参考にしてみてください。
目次
写真を貼り付けるマクロとは?
写真を貼り付けるマクロとは、
指定するフォルダ内にある全ての写真データをエクセルに貼り付ける
という処理を自動化するプログラムのことです。
下記の動画では写真を貼り付けるマクロの動きや使い方を詳しくご紹介しています。
今回ご紹介している「写真を貼り付けるマクロ」の設定がこちら
- A4用紙(タテ)に3枚分の写真を貼り付ける
- 貼り付けた写真の横に写真名を表示する
- 指定するフォルダ内全ての写真を貼り付ける
これらの設定は写真を貼り付けるマクロのコードを修正することで変更可能です。
例えば、
貼り付ける写真を3枚ではなく6枚に変更したい
写真名ではなく撮影日を表示したい
など、業務内容に応じた処理に変更することができます。

拒否する人
このように感じた方は記事の後半で紹介している「写真を貼り付けるマクロの作成依頼」を参考にしてみてください。
写真を貼り付けるマクロを開発した私がどのような処理を実現したいのか聞き取りを行い最適なマクロをご提案します。
写真を貼り付けるマクロの導入方法
写真を貼り付けるマクロを導入に手順がこちら
- 様式の作成
- 「設定」シートの作成
- ユーザーフォームの作成
- マクロの登録
一つ一つ詳しく解説していきます。
様式の作成
コードを作り始める前に、様式の設定をしっかり行う必要があります。
様式設定で抑えておくべき3つのポイント
- 大きさを揃える
- 配置を揃える
- 印刷範囲を意識する
これらのポイントをしっかり抑えておくことでキレイな資料を作成することができます。
横向きの写真を挿入する様式
- 行の高さを「13.5」
- 列の幅を「2」
- ページの縮小を100%
- ページの向きを「縦」
- 上図のようにセルを結合する
縦向きの写真を挿入する様式
- 行の高さを「2」
- 列の幅を「13.5」
- ページの縮小を100%
- ページの向きを「横向き」
- 上図のようにセルを結合する
今回の様式設定は、A4用紙に写真がちょうど3枚入る!という設定です。
「写真添付」という箇所に写真が添付されていき、挿入された写真の名前が「写真の名前」に表示されます。
※写真の大きさの調整は縦横比を変更しない設定で、セルの高さにぴったり合うように設定されています。そのため写真の横幅とセルの横幅がずれることがあります。
「設定」シートの作成
上図のように設定シートを作成します。
A3セルに入力されたテキストからフォルダの場所を読み取る!という仕組みです。

ひらめく人
シート名を「設定」にしてください。シートを区別するマクロが使われているため「設定」にしなければ正常動作しません。
これで設定シートの作成は完了です。
ユーザーフォームの作成
今回は、ユーザーフォームのボタンをクリックすることでマクロが実行されるという仕組みを採用しているので、
VBAでユーザーフォームを作成する必要があります。
写真(横)シートに表示するユーザーフォーム
1 | Private Sub CommandButton1_Click() |
2 | Call 写真挿入横 |
3 | End Sub |
写真(縦)シートに表示するユーザーフォーム
1 | Private Sub CommandButton1_Click() |
2 | Call 写真挿入縦 |
3 | End Sub |
Callで標準モジュールで作成したマクロを呼び出しています。
設定シートでユーザーフォームを表示するマクロ
1 | Private Sub WorkSheet_Activate() |
2 | UserForm1.Hide |
3 | UserForm2.Hide |
4 | End Sub |
写真(横)シートでユーザーフォームを表示するマクロ
1 | Private Sub WorkSheet_Activate() |
2 | UserForm1.Show vbModeless |
3 | UserForm2.Hide |
4 | End Sub |
写真(縦)シートでユーザーフォームを表示するマクロ
1 | Private Sub WorkSheet_Activate() |
2 | UserForm1.Hide |
3 | UserForm2.Show vbModeless |
4 | End Sub |
シートを切り替えることでユーザーフォームが起動する設定にしています。この設定は、間違ってユーザーフォームを閉じてもシートを切り替えるだけで再表示することができるので、感覚的に扱うことができます。
コードの作成
VBA編集画面で「Module」を作成
「Module1」にサンプルコードを記入
サンプルコード①
このサンプルコードは「写真(横)」シート用のコードです。
Sub 写真挿入横()
Dim Ash As Worksheet
Set Ash = Sheets("設定")
Dim Csh As Worksheet
Set Csh = Sheets("写真(横)")
Const cnsTitle = "ファイル名一覧取得"
Const cnsDIR = "\*.*"
Dim xlAPP As Application
Dim strPath, strFilename, myFileName, syasin, Path As String
Dim GYO, rx As Long
Dim zukei As Shape
' 写真(横)シートの25列目最終行数を変数rxに格納
rm = Csh.Cells(Rows.Count, 25).End(xlUp).Row
' 写真(横)シートの全ての写真を削除
For Each sa In Csh.Shapes
On Error Resume Next
If sa.TopLeftCell.Address >= Csh.Cells(100, 1).Address Then
sa.Delete
End If
If Err <> 0 Then
Err.Clear
End If
Next
' 写真(横)シートの25列目に記入されている写真データ名を削除
For i = 3 To rm Step 21
Csh.Range(Csh.Cells(i, 25), Csh.Cells(i + 2, 38)).ClearContents
Next
Set xlAPP = Application
' フォルダの場所を指定する
strPath = Ash.Cells(3, 1)
' フォルダの存在確認 --- 必要な場合のみ記述 ---
If Dir(strPath, vbDirectory) = "" Then
MsgBox "指定のフォルダは存在しません。", vbExclamation, cnsTitle
Exit Sub
End If
' 先頭のファイル名の取得
strFilename = Dir(strPath & cnsDIR, vbNormal)
' ファイルが見つからなくなるまで繰り返す
Do While strFilename <> ""
' 行を加算
GYO = GYO + 21
Csh.Cells(GYO - 18, 25).Value = strFilename
' 次のファイル名を取得
strFilename = Dir()
Loop
' 写真(横)シートの25列目最終行数を変数rxに格納
rm = Csh.Cells(Rows.Count, 25).End(xlUp).Row
For i = 1 To rm Step 21
'変数syasinに貼り付ける写真データ情報を格納
syasin = Ash.Cells(3, 1) & "\" & Csh.Cells(i + 2, 25).Value
'AddPictureで写真を貼り付ける
Set zukei = Csh.Shapes.AddPicture(Filename:=syasin, LinkToFile:=False, SaveWithDocument:=True, Left:=0, Top:=0, Width:=0, Height:=0)
With zukei
.ScaleHeight 1, msoTrue
.ScaleWidth 1, msoTrue
.LockAspectRatio = msoTrue
'''''''''''''''''''''ここの数値を変更することで写真の大きさ、配置を変更できる''''''''''''''''''''''''''
.Height = Csh.Range(Csh.Cells(i + 2, 2), Csh.Cells(i + 20, 23)).Height
rx = (Csh.Range(Csh.Cells(i + 2, 2), Csh.Cells(i + 20, 23)).Width - .Width) / 2
.Left = Csh.Range(Csh.Cells(i + 2, 2), Csh.Cells(i + 20, 23)).Left + rx
.Top = Csh.Range(Csh.Cells(i + 2, 2), Csh.Cells(i + 20, 23)).Top
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
End With
Next i
End Sub
サンプルコード②
このサンプルコードは「写真(縦)」シート用のコードです。
Sub 写真挿入縦()
Dim Ash As Worksheet
Set Ash = Sheets("設定")
Dim Csh As Worksheet
Set Csh = Sheets("写真(縦)")
Const cnsTitle = "ファイル名一覧取得"
Const cnsDIR = "\*.*"
Dim xlAPP As Application
Dim strPath, strFilename, myFileName, syasin, Path As String
Dim RETU, retum, rx As Long
Dim zukei As Shape
' 写真(縦)シートの3行目最終行数を変数retumに格納
retum = Csh.Cells(3, Columns.Count).End(xlToLeft).Column
' 写真(縦)シートの全ての写真を削除
For Each sa In Csh.Shapes
On Error Resume Next
If sa.TopLeftCell.Address >= Csh.Cells(1, 1).Address Then
sa.Delete
End If
If Err <> 0 Then
Err.Clear
End If
Next
' 写真(縦)シートの3行列目に記入されている写真データ名を削除
For i = 2 To retum Step 17
Csh.Range(Csh.Cells(3, i), Csh.Cells(6, i + 15)).ClearContents
Next
Set xlAPP = Application
' フォルダの場所を指定する
strPath = Ash.Cells(3, 1)
' フォルダの存在確認 --- 必要な場合のみ記述 ---
If Dir(strPath, vbDirectory) = "" Then
MsgBox "指定のフォルダは存在しません。", vbExclamation, cnsTitle
Exit Sub
End If
' 先頭のファイル名の取得
strFilename = Dir(strPath & cnsDIR, vbNormal)
' ファイルが見つからなくなるまで繰り返す
Do While strFilename <> ""
' 列を加算
RETU = RETU + 17
Csh.Cells(3, RETU - 15).Value = strFilename
' 次のファイル名を取得
strFilename = Dir()
Loop
retum = Csh.Cells(3, Columns.Count).End(xlToLeft).Column
For i = 2 To retum Step 17
syasin = Ash.Cells(3, 1) & "\" & Csh.Cells(3, i).Value
Set zukei = Csh.Shapes.AddPicture(Filename:=syasin, LinkToFile:=False, SaveWithDocument:=True, Left:=0, Top:=0, Width:=0, Height:=0)
With zukei
.ScaleHeight 1, msoTrue
.ScaleWidth 1, msoTrue
.LockAspectRatio = msoTrue
'''''''''''''''''''''ここの数値を変更することで写真の大きさ、配置を変更できる''''''''''''''''''''''''''
.Height = Csh.Range(Csh.Cells(10, i), Csh.Cells(44, i + 15)).Height
rx = (Csh.Range(Csh.Cells(10, i), Csh.Cells(44, i + 15)).Width - .Width) / 2
.Left = Csh.Range(Csh.Cells(10, i), Csh.Cells(44, i + 15)).Left + rx
.Top = Csh.Range(Csh.Cells(10, i), Csh.Cells(44, i + 15)).Top
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
End With
Next i
End Sub
これでエクセルに自動的に写真を貼りつけるマクロの設定が完了です。
写真を貼り付けるマクロの使い方
写真を貼り付けるマクロの使い方としては、「フォルダに写真を保存」「フォルダの場所を指定」「マクロの実行」の3Stepです。
一つ一つ詳しく解説していきます。
貼り付ける写真を保存するフォルダを作成する
保存場所はどこでもいいので写真保存用のフォルダを作成します。
フォルダ内のすべての写真を貼り付けるコードなのでエクセルに張り付けない不要な写真は保存しないよう注意してください。
「設定」シートでフォルダの場所を入力する
「設定」シートのA3セルにフォルダの場所を記入してください。
A3セル以外のセルは編集不要という意味でA3セル以外のセルの背景色を黄色にしています。
写真を貼り付けるマクロを実行する
ユーザーフォームの「実行」ボタンを押下して設定したマクロを実行してください。
ユーザーフォームはシートを選択すると表示される設定になっています。
なので、「写真(横)」シートでは横写真用のユーザーフォームが表示され、「写真(縦)」シートでは縦写真用のユーザーフォームが表示されます。
以上の手順で写真を貼り付けるマクロを使うことができます。
エクセルに写真をまとめて貼り付けるマクロはデスクワークで効果的
今回紹介した写真を貼り付けるマクロは写真添付が必要な資料作成にめちゃくちゃ効果的!です。
- キレイな資料になる
- 写真挿入後の編集がやりやすい
- 写真を挿入するだけで書類として使える
以下のようなA4用紙に写真が3枚、右側3分の1を写真の名前の表示で使用する様式はいろんな仕事で応用しやすい!評判です。
写真の補足説明や注意事項を入力するために「ファイル名表示」の下はわざと空欄を作っています。
今回紹介しているマクロではファイル名にファイル形式が表示されます。

ガッツポーズの人
もし、マクロを使わず手作業で写真貼り付け作業を行う2倍、3倍の時間が必要になります。

疲れ果てた人
このように写真をまとめて挿入すると、この後の編集にかなり時間がかかります。
- 大きさを編集
- 表示位置を編集
- 名前を付ける
- 全体を揃える
今回紹介するマクロを使えば、
時間のかかる編集作業を一瞬で処理することができ編集ミスがなくなる!
というメリットがあります。
今回はよく使われるA4用紙に3枚の写真を貼り付ける様式でマクロを設定していますがいろんな様式にアレンジすることができます。
例えばこんな感じ
写真を貼り付ける場所、写真の大きさがあらかじめ決まっていればどんな様式にも対応可能です。
デスクワークでは毎日のようにエクセルに写真を貼りつけて編集する作業があります。
作業内容は大量の写真を印刷範囲内にキレイに貼り付ける!です。誰にでもできる単純作業なのに時間ばかりかかってしまう!という問題がありました。
こんな問題を解決するために、写真を貼りつけるマクロを開発
マクロを導入してからは作業の効率が格段に上がり、また資料の完成度に個人差がなくなった!という別のメリットも発生しました。

ガッツポーズの人
VBA初心者が効率化マクロを導入する方法
VBAなんて扱ったことないけどエクセル作業を自動化するマクロを導入したい!
このような問題を抱えながら日々のエクセル業務をこなしている方がおおくいらっしゃるのではないでしょうか。
こんな問題を解決する方法がこちら
- マクロの開発を外注に依頼する
- マクロが設定されたエクセルファイルをダウンロードする
- 参考書やネットでVBAスキルを身に付ける
VBAの勉強を始める前は上記の方法で効率化マクロを導入していました。
完成されたマクロを使ってエクセル業務を処理する
↓
作業効率が2倍以上アップ!!
↓
便利すぎて自分でもマクロを設定したいと考え始める
↓
参考書やネットの情報でVBAスキルを身に付ける
↓
マクロ開発を代行できる程のスキルを習得
VBAは
他のプログラミングに比べて参考書やネットで紹介されている情報量が多いので初心者でも導入しやすい
という特徴があります。
毎日のルーティーン作業にうんざりしている、だれでもできる単純作業に時間を費やしている、という方はあなたに合った方法でVBAを導入しちゃいましょう。
マクロの開発を外注に依頼する
マクロの開発を外注に依頼する導入方法は
VBAを全く扱えない方でもエクセル作業を自動化できる最も簡単な方法
です。
「こんなエクセル作業を自動化したい」「作った資料を自動的にPDFで保存したい」「決まった様式に写真を自動で貼り付けたい」
こんな感じで実現したい内容を依頼するだけで業務内容に合ったマクロを開発してくれます。

ガッツポーズの人
デメリットは、費用がかかることだけ。
開発内容、依頼先によってかかる費用は大きく異なります。
私が会社員の頃利用していた業者さんは1マクロあたり2万円~3万円の費用がかかりました。

疑問がある人
ちなみに、マメBlogでもエクセルマクロ開発代行サービスを承っています。
開発内容の確認、VBAコードの設定、動作確認後の調整、など全ての工程を私(マメ父ちゃん)が行っているので、
費用が安い!スピード納期!!
でやらせてもらっています。
ほとんど独学で身に付けたVBAスキルなので、内容によっては開発できないこともあるのでご了承ください。
ご相談、見積もり依頼は完全無料ですので気になる方は下記のリンクよりお問合せ下さい。
マクロが設定されたエクセルファイルをダウンロードする
VBA初心者でも『マクロが設定されたエクセルファイルをダウンロード』ですぐにエクセル作業を自動化することができます。
たとえば、
A4用紙に写真を貼り付けてコメントを入力する作業を自動化したい!という場合、
『写真を貼り付けるマクロ』が設定されたエクセルファイルをダウンロードすれば問題解決です。
実際に、『写真を貼り付けるマクロ』をダウンロードして使っている様子がこちら

ガッツポーズの人
『マクロが設定されたエクセルファイルをダウンロード』する導入方法は、
VBA初心者でもマクロを導入できる、費用が安い、
というメリットがあります。
しかし
VBAに関する情報が多く公開されているとはいえ、ネット上で想定するマクロは見つけることが難しい
というデメリットもあります。

ガッツポーズの人
個人ブログやファイルを販売できるサイト「note」や「Tips」ではいろんなマクロの情報が掲載されているので是非参考にしてみてください。
今までマメBlogで受注した効率化マクロを下記のnoteで掲載していますので併せてチェックしてみてください。
参考書やネットでVBAスキルを身に付ける
先程も紹介しましたが、
VBAは他のプログラミングに比べて参考書やネットで紹介されている情報量が多いので初心者でも導入しやすい
プログラミングです。
言い換えると、
情報量が豊富なので自分で勉強できちゃう
ということです。
私のVBAスキルはほとんど独学で身に付けたもので、
考えた処理のほとんどをVBAで表現できるレベルにまで到達した!
と思っています。
私の作ったマクロをプロのプログラマーが見れば、
お前の書くコードはインチキだ!「変数の宣言」とか「引数」を正しく使えよ!!
と感じるはずです。
でも、
私からすればどうでもいい!!!想定した内容を正しく処理できればよくないですか!?
独学であっても『写真を貼り付けるマクロ』『全てのシートをPDF出力するマクロ』『連番を振るマクロ』など、
業務内容に合ったマクロを開発できるようになれます。
独学でVBAスキルを身に付けるコツは、
エラーが発生してもいいからひたすらコードを書く、なんでもいいからエクセル作業をマクロ化してみる
です。
とは言っても、全くの知識0の方は何をすればいいかわからないですよね。
VBA知識0の初心者の方は、参考書『たった1秒で仕事が片づくExcel自動化の教科書【増強完全版】』を読んでみてください。
VBAの知識0の方でもすいすい読み進められる内容になっています。
やさしい内容にも関わらず「え!!VBAを使えばこんなことできるの!?」と感動すると思います。
実際に私はこの参考書を読んでからVBAの勉強を始めました。

ひらめく人
VBAの魅力を発見した後は、
ひたすら自動化したい処理を実現するコードを書くだけ
です。
【VBA 写真を貼る】、【VBA PDF出力】、のようにネット検索すれば知りたいコードをすぐにゲットできます。
実現したい処理に向かって、「調べる→書いてみる→エラーを改善する→調べる」を繰り返していると
自然といろんなマクロが作れるようになっているはずです。
VBAに興味が湧いてきたという方は今からVBA学習をスタートさせちゃいましょう。
ディスカッション
コメント一覧
始めまして
平野です。
この度、初めてnoteで購入しダウンロードをしてみたのですが
実行すると一時停止になってしまいます。
仕事で写真を取り込む作業が多い為、是非活用したいと思うのですが
何が原因か分からないです。
For i = 1 To rm Step 21
Csh.Cells(i + 2, 2).Select
syasin = “C:\Users\h-hirano\Desktop\写真注入” & Csh.Cells(i + 2, 25).Value
Csh.Pictures.Insert syasin ←こちらが黄色になってます。
Csh.Pictures.Top = Range(Csh.Cells(i + 2, 2), Csh.Cells(i + 20, 23)).Top
Csh.Pictures.Left = Range(Csh.Cells(i + 2, 2), Csh.Cells(i + 20, 23)).Left
Csh.Pictures.Height = Range(Csh.Cells(i + 2, 2), Csh.Cells(i + 20, 23)).Height
Next i
何卒宜しくお願い致します。
はじめまして。
16行目のコマンドだと画像複数の場合、画像一枚分しか貼られないようでした。マクロを2回実行したら複数枚いけました。
はじめまして。
マメBlogを閲覧していただきありがとうございます。
貴重なコメントありがとうございます。
私の方で検証した結果、ななしさんと同じ事象が発生するときと、発生しないときがありました。
プログラムの見直しをしていきたいと思います。
ありがとうございました。