皆様こんにちは、ノグチです。
大量の画像を、エクセルシートに、画像サイズと位置を揃えて貼り付けていく…そんな作業をしたことはありますか?
ただ貼り付けるだけならまだしも、画像はすべて横位置を揃えて!という指定があったり、フォルダにある画像のサイズはばらばらなのに、エクセルに貼り付けるときはすべて同じサイズに!なんて指定があったり…。
はっきり言って苦行ですよね。
そんな面倒なことはVBAに任せましょう!
ということで、今回はShapesコレクションのAddPictureメソッドとFileSystemオブジェクト使って、フォルダにある画像ファイルを、位置やサイズを指定して、一括で貼り付ける方法をご紹介します!
画像をまとめて貼り付けるメリット
例えばこちらのフォルダにある画像を…
こんな風に、ワンクリックでエクセルシートへ貼り付けることができます。
前回の記事でご紹介したように、AddPictureメソッドのパラメータで貼り付ける画像のサイズや位置も指定ができるので、縦又は横に向かって一定の間隔を空けて画像を貼り付けていくことができるのです。
こんな感じで。
この方法なら画像の横位置も縦位置も、画像のサイズも指定の通りに揃えられるので、人間が手動で貼り付けていくより遥かに早く、正確です。
そして何より、楽です。
フォルダの画像を一括で貼り付けるマクロ
フォルダにある画像を全てエクセルシートに貼り付けるための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文については下記記事で紹介されていますので、併せてご覧ください。
画像と画像の縦の間隔は、
- objFileオブジェクトで取得した「images」フォルダ内の画像ファイルをシートに貼り付ける
- 貼り付けた画像の高さ(Heightパラメータに指定した値=200)+20ポイントを足した値を変数lngTopにセット
- 変数lngTopをAddPictureメソッドのTopパラメータにセット
で空けています。
そして画像のサイズもWidthパラメータとHeightパラメータに指定した数値によって200×300で統一されていますし、画像の横位置もLeftパラメータに「20」を指定しているので、ピシっと左揃えになっています。
このように面倒な画像を貼り付けていく作業も、マクロを使ってしまえば貼り付け漏れもありませんし、目視で画像の位置を揃える…なんて面倒臭い作業も不要ですよ。
ちなみに、AddPictureのパラメータの役割は下記記事で説明しています。
フォルダに画像以外のファイルがあるとどうなるのか
今回ご紹介しているコードは、『images』フォルダには、エクセルに貼り付けることができる画像ファイルのみが格納されていることが前提になっています。
なので、こちらのように『images』フォルダの中身に画像以外のファイルがある状態で上述のコードを実行すると…
この通り、画像として処理できないファイルは「この画像は表示できません」と表示されてしまいます。
こうならないためには、指定したフォルダには画像ファイルのみ保存するようにルール付けをするか、VBAのコード内で取得する画像ファイルの種類を画像ファイルに絞り込まなければいけません。
そのあたりの工夫については、次回以降の記事で紹介していきます。
まとめ
今回は、フォルダにある画像ファイルを全て、一括でエクセルに貼り付ける方法をご紹介しました。
しかし、今回ご紹介したコードには画像ファイルが格納されているフォルダのパスや、画像のサイズ、画像と画像の間隔まですべてコード内で直接指定されています。
このままでは、他のフォルダにある画像や、違うサイズで画像を貼り付けたい場合に使いまわしがききませんね。
折角作ったマクロです。どうせなら他にも使いまわせるよう、次回記事では今回ご紹介したコードを使った、汎用性を高めるための工夫をご紹介していきます。
それでは、最後までお読みいただきありがとうございました!