Excelで文字列に対応する図を呼び出し挿入

このQ&Aのポイント
  • Excelで特定の文字列に対応する図を挿入する方法について教えてください。
  • 指定したセルに入力された文字列に対応する画像ファイルを参照し、別のセルに表示する方法を知りたいです。
  • ファイルの格納フォルダには、Excelの下位にある特定のフォルダを使用していますが、指定したファイルが見つからないとエラーメッセージが表示されます。原因を教えてください。
回答を見る
  • ベストアンサー

Excelで文字列に対応する図を呼び出し挿入

zap35様のコードを参考に、 各シートのC4セルに入っている固有の番号と一致する画像ファイルを参照し B16セルに画像を表示したいと考えています。 マクロを組んでいるエクセル格納 Z:\サービス\チーム\ABC\データ\2019年 画像ファイルはエクセルの下位にフォルダ格納 Z:\サービス\チーム\ABC\データ\2019年\JPEG ★C4セルに記入の文字列と同じファイル名にし格納しているものの、 "指定したファイルがありません"と表示されてしまいます。 原因がわからず、ご教示いただけますでしょうか。 よろしくお願いいたします。 Private Sub Worksheet_Change(ByVal Target As Range) Const trgR As String = "C4" '地図通し番号を入力するセル Const insR As String = "B16" '挿入画像の左上のセル Const path As String = "Z:\サービス\チーム\ABC\データ\2019年\JPEG" 'ファイルの格納フォルダ Const pic As String = ".jpg" '「.(半角)」+ファイルの拡張子" Dim shp As Shape Dim buf As String   If Target.Address(0, 0) = trgR Then     For Each shp In ActiveSheet.Shapes '既に表示されている画像を削除する処理       If Not Intersect(Range(insR), Range(shp.TopLeftCell, _             shp.BottomRightCell)) Is Nothing Then         shp.Delete       End If     Next     Range(insR).Select     buf = Dir(path & Target.Value & pic)     If buf <> "" Then '入力したファイル名があるかチェック       ActiveSheet.Pictures.Insert (path & Target.Value & pic)     Else       MsgBox "指定したファイルがありません"     End If   End If   Target.Offset(1, 0).Select End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

プログラムの中の画像ファイル名の指定が悪いのだと思う。 あとの究明ぐらいは、質問者が、責任をもって、テストをやるべきだ。 ーー なぜならば、 下記を実行してみると、小生の場合は、思い通りの画像が表示された。(一例ですが)。 ーーー 下記はSheet1のシートのChangeイベントに貼り付け。 標準モジュールへ貼り付け、ではないよ。 実行はSheetのC4セルの値の変更。 メニューの実行(F5キー)ではないよ。 Private Sub Worksheet_Change(ByVal Target As Range) 'C4セルの値が変わったら Const trgR As String = "C4" '地図通し番号を入力するセル Const insR As String = "B16" '挿入画像の左上のセル Const path As String = "Z:\サービス\チーム\ABC\データ\2019年\JPEG" 'ファイルの格納フォルダ Const pic As String = ".jpg" '「.(半角)」+ファイルの拡張子" Dim shp As Shape Dim buf As String If Target.Address(0, 0) = trgR Then For Each shp In ActiveSheet.Shapes '既に表示されている画像を削除する処理 If Not Intersect(Range(insR), Range(shp.TopLeftCell, _ shp.BottomRightCell)) Is Nothing Then shp.Delete End If Next '---- Range(insR).Select 'MsgBox path & Target.Value & pic fn = "C:\Users\xxxx\Pictures" & "\PC040626.JPG" ′xxxxはユーザー名を隠したもの。バックスラッシュの表示の部分は、¥です。   MsgBox fn buf = Dir(fn) ' buf = Dir(path & Target.Value & pic) If buf <> "" Then '入力したファイル名があるかチェック 'ActiveSheet.Pictures.Insert (path & Target.Value & pic) ActiveSheet.Pictures.Insert (fn) Else MsgBox "指定したファイルがありません" End If End If Target.Offset(1, 0).Select End Sub

sachiko555
質問者

お礼

imogasi様 ありがとうございます。 上記コードではすべてのシートに反映できなかったので、 Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) のように変更し、すべてのシートに反映することができました。 残るは画像のサイズの指定のみです。 また質問させていただくかもしれませんが、何卒よろしくお願いいたします。

その他の回答 (2)

  • kkkkkm
  • ベストアンサー率65% (1617/2456)
回答No.2

そういう時は Debug.Print path & Target.Value & pic としてイミディエイトウィンドウに結合の結果を表示し、正しいファイルのフルパスが形成されているかどうか確かめてみましょう。

sachiko555
質問者

お礼

kkkkkm様 ご回答ありがとうございます。 そのようにしてみます。

  • oboroxx
  • ベストアンサー率40% (317/792)
回答No.1

良くはわかりませんが、path変数の最後に¥記号がないから、変なファイル名になっているだけではないかな。

sachiko555
質問者

お礼

oboroxx様 ご回答ありがとうございます。 確認します。

関連するQ&A

  • マクロ エクセル2003

    いつも回答して頂き感謝しています。 原紙のブックを開き、別の名前を付けて保存するマクロを考えています。 原紙のブックを開くマクロはネットから探して、少し修正して出来あがったのですが、 この開いた原紙のブックに別の名前を付けて保存するマクロで困っています。 ただ単に名前を付けるだけだったら問題無いのですが、 その名前が既に保存されていないか確認した後、保存としたいのです。 ブックを開く記述を少し引用して出来ないかやってみたのですが、 Const Target2 As String = "C:\Users\Owner\Documents\" & NewFile で、定数式が必要です。と表示されエラーが発生してしまいます。 どのように変更したら上手くいくのでしょうか?宜しくお願い致します。 Sub Sample() Dim buf1 As String Dim buf2 As String Dim NewFile As String Dim ws1 As Worksheet Dim wb As Workbook Set ws1 = ThisWorkbook.Worksheets("作成") NewFile = "借入貸出" & ws1.Range("C4").Value & "." & ws1.Range("D4").Value Const Target1 As String = "C:\Users\Owner\Documents\借入貸出原紙.xlsx" Const Target2 As String = "C:\Users\Owner\Documents\" & NewFile & ".xlsx" buf1 = Dir(Target1) If buf1 = "" Then MsgBox Target1 & vbCrLf & "は存在しません", vbExclamation Exit Sub End If For Each wb In Workbooks If wb.Name = buf1 Then Application.DisplayAlerts = False Workbooks("借入貸出原紙.xlsx").Close Application.DisplayAlerts = True End If Next wb Workbooks.Open Target1 buf2 = Dir(Target2) If buf2 = "" Then End If End Sub

  • エクセル VBA について

    エクセルで、 ダブルクリックしたら"*"を表示したい範囲に【入力】という名前をつけ、 ダブルクリックしたら9つ左のセルの内容を表示したい範囲に【金額】という名前をつけ、 二つの構文?をVisual Basicに作成したんですが、エラーが出てしまいます。 ひとつずつだと上手くいくのですが、なぜでしょうか? わかる方教えてください。 あと申し訳ないのですが、VBAはまったくわからないため、ネット上で構文をコピーして貼り付けました。 そんな者でもわかる修正の説明をお願いいたします。 以下が作成し、エラーとなってしまう構文です。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Const RangeName As String = "金額" If Target.Value = "" Then Target.Value = Target.Offset(0, -9).Value Cancel = True End If End Sub Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Const RangeName As String = "入力" If Not Intersect(Range(RangeName), Target) Is Nothing Then Cancel = True If Target = "*" Then Target = "" Else Target = "*" End If End If End Sub

  • エクセルマクロ フォルダ内のファイル検索で

    よろしくおねがいします。 下記で、どうも指定フォルダ内のファイル名を検索できていないようで 条件の"ないなら"に反応して中断するハズがファイルを開いてしまいます。 思ったのですが、bufの設定にファイル名は指定できないのでしょうか? Sub Start8() Dim buf As String, IptA As String Const Path As String = "C:\001\" IptA = Workbooks("AAA.xls").Sheets("Sheet1").Cells(1, 1).Value buf = Dir(Path & "" & IptA & ".txt") If buf = "" Then Range("A2").Select ActiveCell.FormulaR1C1 = "" & IptA & "は見つかりません" Exit Sub Else Range("A2").Select ActiveCell.FormulaR1C1 = "" & IptFN & "が見つかりました" End If Workbooks.OpenText Filename:= _ "C:\001\" & IptA & ".txt" End Sub

  • エクセルマクロで、書式が違っても文字列を評価する方法

    文字列書式のセルと、標準書式のセルの数字文字列を比較したいのですが、うまくいきません。 書式が違うと、range.textも違う値になってしまうようです。 結局、現状では一度文字列変数の中に一度いれてから処理していますが、もっと他によい方法はないでしょうか? ------------------------------- If range1 = range2 Then  ・・・・・ End If ------------------------------- Dim temp1 As String Dim temp2 As String If temp1 = temp2 Then ・・・・・・ end If ------------------------------

  • excelのファイルとセル値を書き出したい

    excel2003を利用しています。 とあるフォルダにある excelファイル名(自分自身のファイルを除く) を全て書き出して、 且つ A1セルの値をB列に書き出すことを、やろうとvbaを作ってみましたが。 最後のファイルのA1セルを書きだすところで、エラーになっていまい そこだけ空白になってしまいます。※写真参照 記述は以下の通りです。どのように修正すればよいか 教えていただけないでしょうか? また他にもっと優れた記述があれば、そちらも教えて欲しいです。 よろしくお願いします。 Sub test() Dim buf As String, cnt As Long Dim Path As String Path = ThisWorkbook.Path & "\" buf = Dir(Path & "*.xls") cnt = 2 Do While buf <> "" If buf <> ThisWorkbook.Name Then cnt = cnt + 1 Cells(cnt, 1) = buf buf = Dir() Workbooks.Open Filename:=Path & "\" & buf MsgBox Workbooks(buf).Worksheets(1).Range("A1").Value Cells(cnt, 2) = Workbooks(buf).Worksheets(1).Range("A1").Value Workbooks(buf).Close End If Loop End Sub

  • SelectionChangeイベント 文字列エラ

    エクセルvbaなのですが セルをクリックしたときに、該当する値ならメッセージを表示させる際に Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Value = 1Then MsgBox "" End If End Sub ならエラーにならずに動くのに Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Value = "運賃" Then MsgBox "" End If End Sub のように文字列にすると、型が一致しません。 と言うエラーになります。 If Target.Value = "運賃" Then の時でも、空白セルや数値が入ったセルをクリックした際はエラーになりません。 どのような型にすればいいのでしょうか? 実際、「運賃」と言う値が入ってるセルをクリックしても同じエラーが発生します。

  • エクセルで特定のセルへの直接入力だけを禁止したいんです。

    過去の質問を参考に『セルをダブルクリックすると"○"と入力される』というマクロを○⇒●⇒-⇒  ⇒○⇒・・・として使っているんですが、ダブルクリックの度にセルが直接入力の状態(縦の棒の点滅)になってしまい、一度他のセルをクリックしないと次へ進めずに困っています。 良い方法ってあるのでしょうか? ちなみに使用しているマクロは Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Const rng As String = "A1:A3" '処理対象のセル範囲 If Not Application.Intersect(Target, Range(rng)) Is Nothing Then If Target.Value = "" Then Target.Value = "○" ElseIf Target.Value = "○" Then Target.Value = "●" ElseIf Target.Value = "●" Then Target.Value = "-" Else Target.ClearContents End If End If End Sub というものです。 よろしくお願いします。

  • エクセルVBAでフォルダの作成-2

    先ほどダブルクリックすると、クリックしたその名前にしたフォルダを作成して、ハイパーリンクを設定する、ということで質問させていただき、良い回答を頂き質問を閉じましたが、また質問があります。 A列をクリックするとイベントを発生させるのを、 A4セルから、その下のデータが入っているセルまで をイベントが有効な範囲にしたいと思い、考えています。 「If Target.Column = 1 Then」の部分がそれだと思い、 If Target.Range("A4", Range("A" & Rows.Count).End(xlUp)) Then のように考えて実行しましたが、これはダメでした。 このように限られた範囲に変更すにはどのようにすればいいでしょうか? Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Const path As String = "D:\TEMP\倉庫\" Dim wkStr As String  If Target.Column = 1 Then   wkStr = path & Target.Value   If Dir(wkStr, vbDirectory) = vbNullString Then    MsgBox wkStr & "フォルダがありません。作成します。"    MkDir wkStr   Else    MsgBox wkStr & "フォルダは存在します。"   End If   ActiveSheet.Hyperlinks.Add Anchor:=Target, Address:=wkStr  End If End Sub

  • EXCEL VBA 文字列 

    下記のソースの場合、一つのセル(例えばA1)に【鈴木 太郎】とあれば、隣のセル(B1)に"鈴木 太郎"と表示されます。 (これを一つのセルに【鈴木 太郎】【佐藤 太郎】【伊藤 太郎】とあった場合は、"鈴木 太郎】【佐藤 太郎】【伊藤 太郎"と表示されます。) 例えば、C1には【鈴木 太郎】【佐藤 太郎】【伊藤 太郎】とあった場合には、C2には"鈴木 太郎"、D2に"佐藤 太郎"、E2に"伊藤 太郎"とすることは可能でしょうか? ※行によって異なり、【○○ ○○】はいくつあるとは限らないとします。 よろしくお願いいたします。 Sub PickupWords()  Dim Matches As Object  Dim Match As Object  Dim buf As String  Dim c As Variant  With CreateObject("VBScript.RegExp")   .Pattern = "【(.+)】"   .Global = False   Application.ScreenUpdating = False   For Each c In Range("A1", Cells(Rows.Count, 1).End(xlUp))    If .Test(c.Value) Then     buf = c.Value     Set Matches = .Execute(buf)    c.Offset(, 1).Value = Matches.Item(0).SubMatches(0) '括弧の中を取り出す    End If   Next c   Application.ScreenUpdating = True  End With End Sub

  • エクセルでセルをクリックすると“○”と入力したい。

    VBA”超”初心者です。 理屈抜きにして結果だけ教えていただきたいことがございます。 課題である表記を実現するために、 ワークシートエリアに以下を記しました (サイトからコピーしてきただけですが。。) 同時に同じワークシート内において、 "R18:R103" においても'処理対象としたいのですが、 どう改造すればよいでしょうか? (追伸)それと、シングルクリックバージョンも検討したいのです。よろしくお願いします。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Const rng As String = "O18:O103" '処理対象のセル範囲 If Not Application.Intersect(Target, Range(rng)) Is Nothing Then If Target.Value = "" Then Target.Value = "○" Else Target.ClearContents End If End If End Sub

専門家に質問してみよう