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

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

ただいまの
回答率

90.34%

  • VBA

    1904questions

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

エクセルでフォルダ内の画像を自動で取得して表示をさせたい

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 1,038

sor

score 9

VBAについて質問をさせてください。
ほぼ触ったことのない素人です。

エクセルに記載している品番から、特定のフォルダ内にある同じ品番の
jpg(品番がaaaであれば、aaa.jpg)を隣のセルに表示させたいのですが、
実行時にエラーが出てしまいました。

 該当のソースコード

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Dim p As String
Dim h As Range

'写真の保存場所
p = "C:\Users\●●(※ユーザー名が入っています)\Desktop\banner\"

'現在表示されている写真は一度削除する
ActiveSheet.Pictures.Delete

'商品名が入力されている行まで繰り返す
For Each h In Sheet5.Range("E3:E" & Sheet5.Range("E1048576").End(xlUp).Row)

'写真ファイルが保存されている時
If Dir(p & h) <> "" Then
With ActiveSheet.Pictures.Insert(p & h)

'写真ファイル名が入力されているセルから2つ左のセルに挿入
.Top = h.Offset(0, 1).Top
.Left = h.Offset(0, 1).Left
'写真サイズの設定
.Width = h.Offset(0, 1).Width
.Height = h.Offset(0, 1).Height
End With
End If
Next

End Sub


・エクセルの保存場所:Desktop
・画像の保存場所:Desktop\banner
・画像のサイズはバラバラ

・品番のある列はE列(数字8桁、-が間に入る時もあります)、画像を表示させたい列はF列
・Shhet5の「コードを表示」で出てきた個所に入れています
(WorksheetとSelectionChangeとの表示があります)

・参考:https://oshiete.goo.ne.jp/qa/8357181.html
記事のものをコピペし、保存場所やシート名、セルの場所などの手を加えています。
  

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

For Each h In Sheet5.Range("E3:E" & Sheet5.Range("E1048576").End(xlUp).Row)
の部分が黄色くなり、
['Range'メソッドは失敗しました:'_worksheet'オブジェクト]
と表示されます。


該当のエラーで調べてみてもSheetがアクティブになっていないのでは?
といった事例が多く出てきたので、Rangeの前にシート名を
入れてみたりしたのですが解決にはなりませんでした。

これから勉強するつもりではいるのですが、正直初心者にはハードルが高すぎたなと感じております。
どうかご教示いただけないでしょうか。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

動作の重さなどを気にしないのであれば、
そのコード自体には問題はなく、
当方の環境で新しく作ったブックのSheet5のE3からファイル名を入れ、
画像ファイルを用意し、そのコードを入れてやれば、
エラーが再現することなく動いております。

シートがアクティブかどうかは関係ないかと思います、試してみたところ、
シートがアクティブでなくとも実際に画像は貼り付けられませんがエラーも発生しませんでした。

その為、そのコードに問題があるのではなく、
現在テストに使用しているブック・シートに問題があるのではないかと予測されます。
新規ブックでの動作確認(問題の切り分け)は行いましたか?
Sheet5.Range("E1048576").End(xlUp).Row の値はどうなっていますか?
(イミディエイトウィンドウで " ? Sheet5.Range("E1048576").End(xlUp).Row " と入力)

実使用するブックでなにか問題があって最終行の検出がうまくいかない場合で、
どうしてもそのブックにこの機能を適用したい場合は
適当なセルに " =COUNTA(E:E) " を入れその値を使用する、
さらにその値を使用した上で Range の指定を Cells で行う、
( Rangeの指定をCellsで行う例 " Range(Cells(1,1),Cells(i,j)) " )
などにより強引に回避できる場合もあります。

まずは問題の切り分けをお試しください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/06 15:20

    shinobu_osakaさんありがとうございます!
    数点ご指摘をいただきまずは問題の切り分けをするという点、
    運用ファイルでどうにかしないとと思っていたため目から鱗でした。。

    イミディエイトウィンドウでコードを入力してみたところ、
    実行時エラー'1004'; アプリケーション定義またはオブジェクト定義のエラーです。
    と表示されてしまいました。

    ブックやシートに問題があるのではというご指摘からハッと確認してみたところ、
    エクセル自体が他の方が作成した古いもので97-2003のxls形式になっていました。
    ただ、xlsm形式で保存し直しただけでは解決にいたりませんでした。

    そして新しくシートを作り直し、同じコードで試したところ
    無事求めていた挙動の通り実行がされました!
    古いエクセルをどうしても使わないといけないわけでは無いので、
    新しく構成しなおしてみようと思います。
    ご回答いただき、ありがとうございました!

    キャンセル

  • 2018/06/06 17:32

    問題が解決いたしましたようで何よりです。

    状況から鑑みますに、
    「バージョンによりExcelの最大行数が異なる」ことによるエラーのようですね、
    新しく構成し直すのならそちらが理想ですが、
    どうしても旧バージョンのまま動作する必要があれば、
    E65536 とすることによりエラーを回避し動作できるかもしれません。
    また、「新しい形式で保存して開き直すことで使用できる行数が増える」
    と、どこかで読んだので、エクセルを閉じて開き直せば動くかもしれません。

    それでは頑張ってください。

    キャンセル

  • 2018/06/07 09:19

    根本的な原因は、概念的な値を使うべき所で「固定値」を使っている事です。
    つまり、概念的にはシートの「最終行」から上へ移動、という事を「1048576」行目から上へ移動、としているからです。

    [Sheet].Rows.Count で、該当シートの行数が分かるので、
    そちらを使う方が適当でしょう。

    キャンセル

0

Sheet5はグローバル変数でしょうか。
用意されていないのであれば作る必要があります。

Dim Sheet5 As Worksheet
Set Sheet5 = Worksheets("Sheet5")


もしくは直接参照するか。

For Each h In Worksheets("Sheet5").Range("E3:E" & Sheet5.Range("E1048576").End(xlUp).Row)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/06 11:59

    グローバル変数ではないと思います。

    最初から存在する自ブックのシートについては、
    オブジェクト名(コードネーム)で直接アクセス可能です。
    ※自分はこの手法をよく使います(インテリセンスが使えるし、変数宣言しなくていいし、楽です)

    キャンセル

  • 2018/06/06 13:04

    そういやそうですね。
    なんで今まで自分使わなかったんだろう…。
    とすると的外れな回答でしたね。
    ご指摘ありがとうございます。

    キャンセル

  • 2018/06/06 15:10

    ttyp03さん、ExcelVBAerさんご回答ありがとうございます!
    いただいたコードを試してみていたのですが、
    同じエラーになってしまい解決にはいたりませんでした...

    ワークシート自体を変数に入れることができたり、
    オブジェクト名で直接アクセス可能なことを知らなかったため
    いただいた意見もとても勉強になりました。
    ありがとうございました!

    キャンセル

  • 2018/06/06 15:11

    私の回答は見当違いだったのでスルーしてくださいまし。申し訳ない。

    キャンセル

同じタグがついた質問を見る

  • VBA

    1904questions

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