🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
VBA

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

Q&A

解決済

1回答

5059閲覧

VBA 大量の画像を指定の場所に貼り付ける際に成功するときとエラーが発生するときがある

kitagawasho

総合スコア28

VBA

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

0グッド

0クリップ

投稿2019/12/12 00:21

編集2019/12/12 00:50

前提・実現したいこと

保存されている画像をExcelシートの指定の場所に貼り付ける。

簡単な説明として、
・Excelには「input」「チェックシート」の2つのシートがあります。
・「input」には画像の格納先のパスを入力する場所(B4セル)とマクロ実行のボタンがあります。
・「チェックシート」には画像のファイル名(拡張子なし)がF列に書かれている。
・今回はG列に画像を貼り付けていきたい。その時、左(F列)の名前と画像の名前が一致したとき、G列に貼り付けたい。

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

現在エラー文で、 実行エラー’91’; オブジェクト変数またはWith変数が設定されていません。 となってしまいました。 Cells.Find(What:=strImgName).Activateの部分が色塗りされている状態です。 何が原因かわかりませんか? 少し調べたところ、nothingの場合の処理を入れるといいみたいなのですが、 nothingの場合はH列に「NG」と入力するようにしたいです。 ネットで調べると、 Set r = Cells.Find("test") If Not r Is Nothing Then のような書き方でsetが使われていますが、 自分のは違う書き方になっているので対処方法がわかりません。 また、 Set objShape = からの動作もネットから持ってきたもので、H列に入力する処理方法もわからないので 教えていただけませんか?

該当のソースコード

VBA

1Private Sub CommandButton1_Click() 2 Call call_PasteImage 3End Sub 4 5'**************************************************************** 6' グローバル変数 7'**************************************************************** 8 9'【Path取得セル】"INPUT"シート 10Public Const pathClm As Integer = 2 'B 11Public Const pathRow As Integer = 4 12 13Dim ImagePath As String ' 貼り付け用画像格納フォルダパス 14 15Function call_PasteImage() 16Dim objShape As Object 17Dim strFileName As String 18Dim strImgName As String 19 20ImagePath = Cells(pathRow, pathClm) 21strFileName = Dir(Range("B4").Value & "*.jpg") 22 23Sheets("チェックシート").Select 24 25 Do Until Len(strFileName) = 0 26 strImgName = Left(strFileName, Len(strFileName) - 4) 27 28 Cells.Find(What:=strImgName).Activate 29 ActiveCell.Offset(0, 1).Activate 30 31 Set objShape = ActiveSheet.Shapes.AddPicture( _ 32 fileName:=ImagePath & strFileName, _ 33 LinkToFile:=False, _ 34 SaveWithDocument:=True, _ 35 Left:=ActiveCell.Left, _ 36 Top:=ActiveCell.Top, _ 37 Width:=ActiveCell.Width, _ 38 Height:=ActiveCell.Height) 39 40 strFileName = Dir() 41 Loop 42 43End Function 44

試したこと

ここに問題に対して試したことを記載してください。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

kitagawasho

2019/12/12 02:25

すみません。そちらの回答を見落としていました、、、 自分で調べてnothingが返されてその処理が書かれていないのでエラーになると思い、nothingが返された時の処理を付け足そうと思って今回質問をしました
guest

回答1

0

ベストアンサー

一つ前に投稿されていた質問に書かれていた返答にあるとおり

Cells.Findは検索したけど見つからなかった場合に、
Nothingを返すのでActivateがエラーになります。

この点の問題が解決されていないためであるように思われます。

Cells.Find(What:=strImgName).Activate

「Ctrl + F」で出てくる「検索と置換」ダイアログと
同じ機能をCells.Findを用いて稼動させています。

Cells.FindではRange型を返してきますので、検索対象の文字列(この場合、strImgName)を
シート内にて検索した結果、見つかったのでそのセルの座標(例えば、A1、とか)が返ってきて、
そのセルをActivateしています。
見つからなかったら、「nothing」が返されます。
「nothing」ではセルの座標にならないのでエラーになっています。


ネットで調べると、~

の内容はたぶん正解なのだと思います。その前提で。

Dim FoundCell As Range

↑Dimの並んでいる所、strImgNameの下にでも追加。

Do Until Len(strFileName) = 0 strImgName = Left(strFileName, Len(strFileName) - 4) Set FoundCell = Cells.Find(What:=strImgName) If FoundCell Is Nothing Then cells(Activecell.row,"H").value = "NG" 'この行は適宜修正してください Else ActiveCell.Offset(0, 1).Activate Set objShape = ActiveSheet.Shapes.AddPicture( _ fileName:=ImagePath & strFileName, _ LinkToFile:=False, _ SaveWithDocument:=True, _ Left:=ActiveCell.Left, _ Top:=ActiveCell.Top, _ Width:=ActiveCell.Width, _ Height:=ActiveCell.Height) strFileName = Dir() End If Loop

↑Do~Loopの内側だけを最小限にだけ修正してみました。上記2点です。

ここまで書きましたが全体的に不明な点もありますので
私のも正しいかちょっと分からない感じです(^^;
動作確認しながら必要な箇所は修正してください。

Office TANAKA - セルの検索

投稿2019/12/15 11:16

glam0337_k

総合スコア42

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問