質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

解決済

3回答

2786閲覧

Excelに画像一括挿入(貼付)を自動で行いたい

rainbow0707

総合スコア2

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

0グッド

0クリップ

投稿2021/09/16 04:48

編集2021/09/16 14:23

実現したいこと

複数画像をサイズ調整つき(セル内に収めたい)でExcelに一括挿入で自動貼付できるようにしたいです。
現在はOneDrive経由の個人フォルダ内で作成していますが、最終的にはGoogleドライブ上にアップロードするので、その際に互換性やエラーが出ないように進めたいと思っています。

サイズ自動調整の一括画像貼り付けのVBA・マクロが組めたらいいのですが、その辺は知識が足りず、サンプルコードからの修正・応用も上手くいかなかったので、何かいい方法があればお聞きしたいです。

事前設定・前提条件

・今回貼付したい画像ファイルを格納したフォルダをCドライブ内に用意。 
・同じくCドライブ内に今回対象のExcelファイルも格納済。
・シート名「CRデータ」に画像ファイルのパスコピーを入力済(A1は「画像パス」の文言、A2から実際の画像パス)
・シート名「クリエイティブ」が実際に画像を貼り付けるシートであり、D6から画像を貼付ける箇所として設定しています。
・画像サイズは複数パターンあるため、(300x300や320x100等)Excelの行の高さを49.5(66ピクセル)、幅は21.88(180ピクセル)で設定しておりますが、縦横比維持したまま貼付けしたいので、一旦高さだけ合っていれば幅は問わず、あとは各セルの中に収まればいいと考えています。

発生している問題・エラーメッセージ

(最新の内容だと) 画像パスの1枚目の画像が指定のシート&開始セルに貼り付けられたが、 10枚以上同じ画像が同じセルに元のサイズで貼り付けられた状態

該当のソースコード

④修正して現在のコード

Sub 画像一括挿入() Dim shpPic As Shape Dim myNo As Long Dim i As Long Dim myRow As Long Dim myName As String Dim myDataCnt As Long myDataCnt = Worksheets("CRデータ").Range("A2").End(xlDown).Row myNo = 1 myRow = 2 Worksheets("クリエイティブ").Select Dim shp As Object For myNo = 1 To myDataCnt myName = Worksheets("CRデータ").Cells(2, 1).Value With Worksheets("クリエイティブ").Shapes.AddPicture _ (Filename:=myName, _ LinkToFile:=False, _ SaveWithDocument:=True, _ Left:=Range("D6").Left, _ Top:=Range("D6").Top, _ Height:=-1, _ Width:=-1) LockAspectRatio = msoTrue myRow = myRow + 1 End With Next End Sub

③ご回答頂き修正したコード(その1)

Sub 画像一括挿入() Dim shpPic As Shape Dim myNo As Long Dim i As Long Dim myRow As Long Dim myName As String myDataCnt = Worksheets("CRデータ").Range("A2").End(xlDown).Row myNo = 1 myRow = 2 Worksheets("クリエイティブ").Select Do Until myNo > myDataCnt myName = Worksheets("CRデータ").Cells(myNo, 1).Value        Cells(myRow, 2).Select Worksheets(クリエイティブ).Shapes.AddPicture _  Filename:=myName, _ LinkToFile:=False, _ SaveWithDocument:=True, _ LockAspectRatio:=msoTrue, _ Height:=49.5 With shp .Left = Range("D6").Left .Top = Range("D6").Top End With Loop End Sub

②書き換えを試みたコード

Sub 画像一括挿入() Dim shpPic As Shape Dim myNo As Long Dim i As Long Dim myRow As Long Dim myName As String myDataCnt = Worksheets("CRデータ").Range("A2").End(xlDown).Row myNo = 1 myRow = 2 Worksheets("クリエイティブ").Select Do Until myNo > myDataCnt myName = Worksheets("CRデータ").Cells(myNo, 1).Value Cells(myRow, 2).Select Worksheets(クリエイティブ).Shapes.AddPicture _ Filename:=myName, _ LinkToFile:=False, _ SaveWithDocument:=True, _ LockAspectRatio:=mso True, _ Height:=49.5 With shp .Left = Range("D6").Left .Top = Range("D6").Top End With End Sub

①最初に試したコード

Sub 画像一括挿入()    Dim myDataCnt As Long    Dim myNo As Long    Dim i As Long    Dim myRow As Long    Dim myName As String        myDataCnt = Worksheets("CRデータ").Range("A2").End(xlDown).Row    myNo = 1    myRow = 2        Worksheets("クリエイティブ").Select    Do Until myNo > myDataCnt       myName = Worksheets("CRデータ").Cells(myNo, 1).Value              Cells(myRow, 2).Select       ActiveSheet.クリエイティブ.Insert(画像パス).Select       Selection.ShapeRange.LockAspectRatio = msoTrue       Selection.ShapeRange.Height = 49.5       myRow = myRow + 1       myNo = myNo + 1    Loop     End Sub

###ここに言語名を入力

①VBE (で違うことに気付いて②に書き換えのつもり) ②VBA 

試したこと

試した方法としては、フォルダ内に貼り付けしたいExcelファイルを格納しておいて画像のパスのコピーを表示したいシート内のセルにペーストし、Ctrl+Alt+Shift+Bでセルサイズに自動調整された状態で貼り付けできたような気がしたのですが上手くいきません。 (なお、ファイルはGoogleドライブからスプレッドシートをダウンロードしてExcelにし、OneDriveの中の個人フォルダに格納されている状態) 元々スプレッドシートで画像をIMAGE関数で表示させているものなので、ダウンロードしてExcelファイルで開くと#NAME?と関数が対応しておらず、画像を値貼りした状態で落とし直しても画像が表示されず、スプレッドシートの画像をコピーしてExcelに全貼り付けするとセルとサイズが合わない状態でずれてしまいます。 (画像サイズは複数パターンあり、画像によって高さや縦横比が異なる) 最終的にはExcelで完成させた後に再度Googleドライブ上に格納し、スプレッドシートで確認したり、送付するような形になります。 下記のコード引用して実行してみたが、リンク貼り付けになるためAddPictureに書き換えようと試みる https://xtech.nikkei.com/it/pc/article/NPC/20071101/286186/ →コンパイルエラー続出(構文エラー等) →いくつかの修正を経て④のコードが現在の状態

補足情報(FW/ツールのバージョンなど)

マクロ・VBAはこれまで触ったことがありません。全くの素人です。
業務上、効率化するために今回検索して似た記述をベースにして作成してみましたが、全然わからないままエラーで苦戦している状態です。。。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hex309

2021/09/16 04:58

書き換えたコードのどの部分でエラーになっているのですか?
rainbow0707

2021/09/16 05:31

コメント頂きありがとうございます。 エラーに関しては以下の箇所が赤字で構文エラーになっています。 Worksheets(クリエイティブ).Shapes.AddPicture _ Filename:=myName, _ LinkToFile:=False, _ SaveWithDocument:=True, _ LockAspectRatio:=mso True, _ Height:=49.5 前部分の構文との組合せでそうなっているのかわかりません。 一番最初の「Sub 画像一括挿入()」の箇所は黄色マーカーが引かれていて左から➡も表示されています。
hex309

2021/09/16 05:39

ありがとうございます。上記の情報は「質問」に追記いただいたほうが回答がつきやすいと思います
rainbow0707

2021/09/16 06:02

ご教示頂きありがとうございます。 質問に追記させて頂きました。
guest

回答3

0

ベストアンサー

縦横比を固定し、セルの高さに合わせるコードです。
貼り付け先のセルについては、修正してみてください。

VBA

1Sub 画像一括挿入() 2 Dim shpPic As Shape 3 Dim myNo As Long 4 Dim i As Long 5 Dim myRow As Long 6 Dim myName As String 7 Dim myDataCnt As Long 8 9 myDataCnt = Worksheets("CRデータ").Range("A2").End(xlDown).Row 10 myNo = 1 11 myRow = 2 12 13 Worksheets("クリエイティブ").Select 14 Dim shp As Object 15 For myNo = 1 To myDataCnt 16 myName = Worksheets("CRデータ").Cells(myNo, 1).Value 17 With Worksheets("クリエイティブ") 18 Set shp = .Shapes.AddPicture _ 19 (Filename:=myName _ 20 , LinkToFile:=False _ 21 , SaveWithDocument:=True _ 22 , Left:=.Cells(myRow, 2).Left _ 23 , Top:=.Cells(myRow, 2).Top _ 24 , Height:=-1 _ 25 , Width:=-1) 26 shp.LockAspectRatio = True 27 shp.Height = .Cells(myRow, 2).Height 28 myRow = myRow + 1 29 End With 30 Next 31End Sub

投稿2021/09/16 07:30

hex309

総合スコア761

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rainbow0707

2021/09/16 08:23

縦横比固定のコードまでご教示頂きありがとうございます。 コード変更してみた上でいくつかエラーが出て対応しましたが、現時点では該当箇所「myDataCnt = Worksheets("CRデータ").Range("A2").End(xlDown).Row」で「実行時エラー’9’ インデックスが有効範囲にありません」のアラートが出ている状態になってます。。。 設定しているA2が合ってないんでしょうか?
hex309

2021/09/16 08:45

「CRデータ」シートはちゃんと存在しますか?仮にあっても、別のブックがアクティブだとうまくいかないと思います。
rainbow0707

2021/09/16 09:13

ありがとうございます。上記の問題は一旦解決できたようです。 その代わり「With Worksheet(”クリエイティブ”)~Width:=-1)」の箇所で「実行時エラー’1004' 指定したファイルが見つかりませんでした」と表示されています。 ちなみに貼り付け先のセルはLeft・Topどちらも「.Cells(myRow, 2)」→「Range(”D6”)」と変更しました。 「クリエイティブシートのD6セルから画像パスの画像を順番に貼り付ける」という指示を出しているつもりですが、記述内容としておかしければ教えて頂きたいです。
hex309

2021/09/16 09:21 編集

エラーメッセージの通りではないでしょうか。エラー時に対象となっているファイルはちゃんと存在してますか? あと、 その記述では画像はすべてD6に貼り付くかと
rainbow0707

2021/09/16 09:38 編集

はい、ファイルはあります。 Excelと画像は同じフォルダの中にありますが、具体的には画像はさらにそのフォルダ内に画像フォルダを作ってあり、その中に格納されています。(Excelファイルの1つ階層下というんですかね) この場合、画像フォルダから画像をすべて取り出してExcelファイルと同じ階層にないと存在してないことに見なされますか?(格納先変更の場合は画像パスも変更予定) それか、Excelファイル上のシートのどこかに画像のフォルダパスを貼り付けて参照した方がいいでしょうか? >その記述では画像はすべてD6に貼り付くかと D6セルから順番に以下セルに貼付けていく場合はどう指定するんでしょうか? 今後も画像が増える可能性もあるので終わりの行は指定しないでブランクにできますか?
hex309

2021/09/16 09:59 編集

ファイルはあっても取得しているパスが違うと言うことはありませんか? 順番に貼り付ける処理は提示したコードがそうなっています。D6からではないので、そこはコードの意味を考えてみてください ちなみに「CRデータ」シートにパスが入力されているんですよね
rainbow0707

2021/09/16 11:38

確認しましたがパスは間違いなく、各画像より取得した画像パス(C:~.jpgのパスコピー)を「CRデータ」シートにA2セルから順番に貼り付けてあります。(A1は画像パスの見出し)
hex309

2021/09/16 11:57

エラー時の変数myNameの値はどうなっていますか?
rainbow0707

2021/09/16 12:38

myNameの値はカーソル合わせた時は画像パスと出てました。 一部を下記の通りにコード変更したら、1枚目の画像がD6に複数枚重なって元のサイズのまま貼り付けられた状態になりましたので、あとは画像パス2枚目以降とサイズの調整ができれば、といったところですね。 myName = Worksheets("CRデータ").Cells(2, 1).Value With Worksheets("クリエイティブ").Shapes.AddPicture _ (Filename:=myName, _ LinkToFile:=False, _ SaveWithDocument:=True, _ Left:=Range("D6").Left, _ Top:=Range("D6").Top, _ Height:=-1, _ Width:=-1) LockAspectRatio = msoTrue myRow = myRow + 1 ふと思ったのですが、画像パスをCRデータというシートに貼ってるから余計に難しくなってエラーが続出している、ことはありますでしょうか? クリエイティブシートには画像ファイル名(パスではなくて画像に直接付けている名前)がB6から順に入力されてあるので、フォルダから同じ名前の画像を取得して貼り付けられれば問題はないのですが。。
hex309

2021/09/16 12:46 編集

なるほど。まずは、私が提示したコードを1行ずつ理解していただくところからお願いします。 そのうえで、「この行がわからない」といっていただければ回答します。 そうすれば、どこを修正すれば望まれた処理ができるかわかると思います。
hex309

2021/09/16 13:03

まずは、以下を参考にして、RangeプロパティとCellsプロパティについて理解されることをおすすめします。 https://www.sejuku.net/blog/28260
rainbow0707

2021/09/16 13:53 編集

ありがとうございます。何度もすみません。。。 上記確認する前にコメントしてしまい失礼しましたm(__)m(今リンク先の内容確認中です) 下記の通り順番にお聞きしますね。 ①「myName = Worksheets("CRデータ").Cells(2, 1).Value」は読み込むファイル名で、CRデータシートのセル2行目・1列目(A列)を指定していると認識していますが合っていますでしょうか? 指定したセルが開始位置でなくこれだけが対象となってしまっているので2行目以降も順番に貼り付けられるように処理がしたいです。 ②LeftとTopの指定について 「Rangeは変数を使わないセル指定に使う」ということですが、ここでD6だけを指定しているのでD6だけに繰り返し画像が貼り付けられている、という認識です。現時点で必要なセルまでの範囲指定(例えばD6:D80とか)で指定しないと順番には貼り付けられないでしょうか? ③HeightとWidthについて セルの高さに合った状態で縦横比が固定であればいいのですが、Heightを49.5にしてWidthをブランク(縦横比維持したまま高さに合わせる)にすることはできますでしょうか?
hex309

2021/09/16 13:54

言葉足らずですみません。私が提示したコードについて、確認してみてください。前にも書いたのですが、対象のセルの指定ができればお望みの動作になると思います
rainbow0707

2021/09/16 14:12

こちらこそ認識がずれていてすみません。 ご提示頂いた、縦横比を固定し、セルの高さに合わせるコードに戻してみましたが、やはり「Set shp = .Shapes.AddPicture _~, Width:=-1)」までが黄色マーカーで、「実行時エラー'1004’で指定したファイルが見つかりませんでした」のアラートが出ます。 先程修正したコードで一度画像が貼り付いたのでパスが違うとかはないかと思います。 コードをご提示頂いた際に、貼り付け先のセルについては修正してみてください、とのことでしたので「Range(”D6”)」を使用したのですが、先程ご教示頂いたリンクの内容だとCellsの方が範囲が変動なのでふさわしい、というのは理解できたつもりです。 その場合、myRow=画像を貼り付けるセルの行位置を特定する変数 として、D6のセルから以下に貼り付けるように設定するにはどう指定すればいいかがわかりません。。
hex309

2021/09/16 14:17

まず、以下の部分を確認してください。 意味を理解すればエラーの理由も分かるはずです。すごく近いところで外しちゃってる感じです For myNo = 1 To myDataCnt myName = Worksheets("CRデータ").Cells(myNo, 1).Value
rainbow0707

2021/09/16 14:34 編集

>確認とは意味を理解する、ということで合ってますでしょうか? For myNo = 1 To myDataCnt myNo=プログラムの中で処理する際、何番目のデータを処理しているかを明らかにするための変数 myDataCnt=読み取る画像ファイルの件数をセットするための変数 なので上記が=である(myNoが変動すればmyDataCntも変動) 読み込むファイル名=CRデータシートの1番目のセル(ちなみにA1は見出し) という意味合いで認識していますが違いますか? そもそもマクロ・VBAに関しては全くの素人で今まで触ったことがなければ用語も初めて聞くものなので、今日1日中検索して調べられる範囲内でしか理解できていません。ご容赦頂けますと幸いです。。
hex309

2021/09/16 14:39

そこまでわかってらっしゃるのであれば、 myName = Worksheets("CRデータ").Cells(myNo, 1).Value のmyNoは、2からじゃないとファイルのパスは取れないですよね また以下は違います。ループ処理について調べてみてください myNoが変動すればmyDataCntも変動
hex309

2021/09/17 00:00

こちらでいかがでしょうか。 Sub 画像一括挿入2() Dim myNo As Long Dim myRow As Long Dim myName As String Dim myDataCnt As Long myDataCnt = Worksheets("CRデータ").Range("A2").End(xlDown).Row myRow = 6 Worksheets("クリエイティブ").Select Dim shp As Object For myNo = 2 To myDataCnt myName = Worksheets("CRデータ").Cells(myNo, 1).Value With Worksheets("クリエイティブ") Set shp = .Shapes.AddPicture _ (Filename:=myName _ , LinkToFile:=False _ , SaveWithDocument:=True _ , Left:=.Cells(myRow, 4).Left _ , Top:=.Cells(myRow, 4).Top _ , Height:=True _ , Width:=True) shp.LockAspectRatio = True shp.Height = .Cells(myRow, 4).Height myRow = myRow + 1 End With Next End Sub
rainbow0707

2021/09/17 00:25

朝早くからありがとうございます。 昨日はループ処理を調べながら落ちてしまいましたm(__)m 意味については少しはわかったつもりです。 For~Nextはセットの構文で、繰り返し回数が決まっている時の反復処理で使用。 For カウント変数=最初の値 To 最後の値  ’繰り返したい処理 Next カウント変数 ということですよね? 「繰り返しの回数が決まっている」とは指定セルまでというような範囲指定ではなくても使うものなんですね。 上記の作成ご対応頂いたコードもありがとうございます。 1点確認ですが、 myName = Worksheets("CRデータ").Cells(myNo, 1).Value 昨日のご説明ではmyNoは、2からじゃないとパスは取れない、と仰ってましたがこの場合は1でいいんでしょうか? まずは上記コードでやってみたいと思います。
hex309

2021/09/17 00:29

myName = Worksheets("CRデータ").Cells(myNo, 1).Value ですが、今朝提示したコードでは、myNoの最初の値は2になってますよ。 以下の部分で、初期値を2にしているので。 For myNo = 2 To myDataCnt
rainbow0707

2021/09/17 00:52

なるほど。最初の値が2であれば問題ないんですね! 今、頂いたコード通りやってみたところ、無事貼付られました!!!! ありがとうございます!!!! ちなみにセルサイズに収まらなかった一部の画像を収める方法やセルに合わせて移動やサイズ変更する場合等はコードを追記する方法で合ってますか?
hex309

2021/09/17 01:00 編集

貼り付けた画像は、変数shpに入れてあります。 なので、以下の部分で高さを調整できています。 この部分を変数・追記すればよろしいかと。 shp.Height = .Cells(myRow, 4).Height
rainbow0707

2021/09/17 01:08

かしこまりました。 あとは調べて追記してみます。 何から何までご教示頂きありがとうございました!!!!
guest

0

すみません。ちょっと私も勘違いがありましたので、こちらのサンプルでお試しください。
画像の縦横のサイズは適当です。
こちらを試していただいて、さらにおやりになりたいこととわからないことをご提示ください。

Sub 画像一括挿入() Dim shpPic As Shape Dim myNo As Long Dim i As Long Dim myRow As Long Dim myName As String Dim myDataCnt As Long myDataCnt = Worksheets("CRデータ").Range("A2").End(xlDown).Row myNo = 1 myRow = 2 Worksheets("クリエイティブ").Select For myNo = 1 To myDataCnt myName = Worksheets("CRデータ").Cells(myNo, 1).Value With Worksheets("クリエイティブ") .Shapes.AddPicture _ Filename:=myName _ , LinkToFile:=False _ , SaveWithDocument:=True _ , Height:=100 _ , Width:=50 _ , Left:=.Cells(myRow, 2).Left _ , Top:=.Cells(myRow, 2).Top myRow = myRow + 1 End With Next End Sub

投稿2021/09/16 06:49

hex309

総合スコア761

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rainbow0707

2021/09/16 07:42

ありがとうございます。まずはこちらを試してみます。
guest

0

エラーの個所を提示いただきました。

以下でエラーとのことですので、該当箇所についてです。

VBA

1Worksheets(クリエイティブ).Shapes.AddPicture _ 2Filename:=myName, _ 3LinkToFile:=False, _ 4SaveWithDocument:=True, _ 5LockAspectRatio:=mso True, _ 6Height:=49.5

まず、「Fileなめ」の前に「,(カンマ)」が必要です。
VBA~~ ~~, Filename~~ ~~

また、「mso True」ではなく以下です(「mso」と「True」の間のスペースは不要)
VBA~~ ~~msoTrue~~ ~~
AddPictureメソッドに「LockAspectRatio」はありませんね。

投稿2021/09/16 05:41

編集2021/09/16 07:02
hex309

総合スコア761

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rainbow0707

2021/09/16 06:24

ご回答頂きありがとうございます。 質問にも追記させて頂きましたが、上記に修正した後に「Doに対するLoopがありません」と表示されたので、End Withの下に「Loop」を追加しました。 その後は現在のエラー内容の通り、「インデックスが有効範囲にありません」との表記がされています。
hex309

2021/09/16 06:28

すみません。「Filename」の前のカンマは不要でした。
rainbow0707

2021/09/16 06:43

ありがとうございます。 「Filename」前のカンマを削除しましたが、エラー内容は変わらずになってます。。。
hex309

2021/09/16 07:11

申し訳ありません。別途サンプル提示しましたので、 そちらでお試しください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問