エクセルVBAで大量の画像をまとめてシートに貼り付けるAddPictureメソッドの使い方

excel,vba,shapes,addpicture,repeat,eyecatch

皆様こんにちは、ノグチです。

大量の画像を、エクセルシートに、画像サイズと位置を揃えて貼り付けていく…そんな作業をしたことはありますか?

ただ貼り付けるだけならまだしも、画像はすべて横位置を揃えて!という指定があったり、フォルダにある画像のサイズはばらばらなのに、エクセルに貼り付けるときはすべて同じサイズに!なんて指定があったり…。

はっきり言って苦行ですよね。

そんな面倒なことはVBAに任せましょう!

ということで、今回はShapesコレクションのAddPictureメソッドとFileSystemオブジェクト使って、フォルダにある画像ファイルを、位置やサイズを指定して、一括で貼り付ける方法をご紹介します!

スポンサーリンク

画像をまとめて貼り付けるメリット

例えばこちらのフォルダにある画像を…

excel,vba,shapes,addpicture,repeat,images

こんな風に、ワンクリックでエクセルシートへ貼り付けることができます。

前回の記事でご紹介したように、AddPictureメソッドのパラメータで貼り付ける画像のサイズや位置も指定ができるので、縦又は横に向かって一定の間隔を空けて画像を貼り付けていくことができるのです。

こんな感じで。

excel,vba,shapes,addpicture,repeat,images,all,sheet

この方法なら画像の横位置も縦位置も、画像のサイズも指定の通りに揃えられるので、人間が手動で貼り付けていくより遥かに早く、正確です。

そして何より、楽です。

フォルダの画像を一括で貼り付けるマクロ

フォルダにある画像を全てエクセルシートに貼り付けるためのVBAコードがこちら。

Sub 画像貼り付け()
Dim lngTop As Long
Dim objFile As Object
Dim objFldr As FileSystemObject

    Set objFldr = CreateObject("Scripting.FileSystemObject")

    lngTop = 20
    
    For Each objFile In objFldr.GetFolder(ThisWorkbook.Path & "\images").Files
        ActiveSheet.Shapes.AddPicture _
                Filename:=objFile, _
                LinkToFile:=False, _
                SaveWithDocument:=True, _
                Left:=20, _
                Top:=lngTop, _
                Width:=300, _
                Height:=200
        
        lngTop = lngTop + 200 + 20
    
    Next

End Sub

FileSystemオブジェクトとFor Each~Nextを使って、エクセルと同じ階層にある『images』というフォルダにある画像ファイルを全て、順番にエクセルシートの下方向に向かって貼り付けていくコードです。

FileSystemオブジェクトとFor Each~Next文については下記記事で紹介されていますので、併せてご覧ください。

Word VBAでFor Each~Next文を使ってフォルダ内のドキュメント全てを操作をする方法
複数のWordドキュメントについて一括で処理をするWordマクロの作り方についてお伝えしています。今回はWord VBAでFor Each文を使ってフォルダ内のドキュメント全てを順番に開いて操作をする方法です。

画像と画像の縦の間隔は、

  1. objFileオブジェクトで取得した「images」フォルダ内の画像ファイルをシートに貼り付ける
  2. 貼り付けた画像の高さ(Heightパラメータに指定した値=200)+20ポイントを足した値を変数lngTopにセット
  3. 変数lngTopをAddPictureメソッドのTopパラメータにセット

で空けています。

そして画像のサイズもWidthパラメータとHeightパラメータに指定した数値によって200×300で統一されていますし、画像の横位置もLeftパラメータに「20」を指定しているので、ピシっと左揃えになっています。

このように面倒な画像を貼り付けていく作業も、マクロを使ってしまえば貼り付け漏れもありませんし、目視で画像の位置を揃える…なんて面倒臭い作業も不要ですよ。

ちなみに、AddPictureのパラメータの役割は下記記事で説明しています。

エクセルVBAで画像ファイルをシートに追加するAddPictureメソッドの使い方
ShapesオブジェクトのAddPictureメソッドで、エクセルのシート上に画像を追加する方法をご紹介しています。画像のサイズや位置が決まっている場合、手動で調整するのは手間なもの。エクセルVBAで位置やサイズを指定しておけば、面倒な調整が不要になりますよ。

フォルダに画像以外のファイルがあるとどうなるのか

今回ご紹介しているコードは、『images』フォルダには、エクセルに貼り付けることができる画像ファイルのみが格納されていることが前提になっています。

なので、こちらのように『images』フォルダの中身に画像以外のファイルがある状態で上述のコードを実行すると…

excel,vba,shapes,addpicture,repeat,images,anotherfiletypeこの通り、画像として処理できないファイルは「この画像は表示できません」と表示されてしまいます。

excel,vba,shapes,addpicture,repeat,images,anotherfiletype,errorこうならないためには、指定したフォルダには画像ファイルのみ保存するようにルール付けをするか、VBAのコード内で取得する画像ファイルの種類を画像ファイルに絞り込まなければいけません。

そのあたりの工夫については、次回以降の記事で紹介していきます。

まとめ

今回は、フォルダにある画像ファイルを全て、一括でエクセルに貼り付ける方法をご紹介しました。

しかし、今回ご紹介したコードには画像ファイルが格納されているフォルダのパスや、画像のサイズ、画像と画像の間隔まですべてコード内で直接指定されています。

このままでは、他のフォルダにある画像や、違うサイズで画像を貼り付けたい場合に使いまわしがききませんね。

折角作ったマクロです。どうせなら他にも使いまわせるよう、次回記事では今回ご紹介したコードを使った、汎用性を高めるための工夫をご紹介していきます。

それでは、最後までお読みいただきありがとうございました!

連載目次:エクセルVBAで図形を操作するShapeオブジェクトの使い方

画像、オートシェイプ、グラフ、テキストボックス、ワードアート、ボタン…エクセルでは様々なものをシートに配置できますが、これらのアイテムは全てShapeオブジェクトです。これら、Shapeオブジェクトの挿入や配置など、自在に操作する方法をお伝えしていきます。
  1. エクセルVBAで画像やオートシェイプなどを操作するShapeオブジェクトのはじめの一歩
  2. エクセルVBAで画像ファイルをシートに追加するAddPictureメソッドの使い方
  3. 【エクセルVBA】AddPictureメソッドで挿入した画像にリンクを張る方法
  4. エクセルVBAで大量の画像をまとめてシートに貼り付けるAddPictureメソッドの使い方
タイトルとURLをコピーしました