エクセルを使って、トレーニング名に応じて画像を自動切換表示させたい

このQ&Aのポイント
  • Sheet1には、トレーニング名、説明文、画像(jpgファイル名)等の項目を作り、100件以上のレコードが入っている表があります。Sheet2に、上記の3レコード(=3トレーニング)分のデータをA4用紙に見やすく配置したフォーム(?)を作り、VLOOKUP関数を使って、データを表示させるようにしました。一つ目のレコードについては画像を表示させることができたのですが、2つめ以降のレコードについては画像を表示させることができません。
  • 上記のコードは、ワークシートの変更イベントがトリガーされた際に実行されるマクロです。コード内で指定されたセルの値が変更された場合、指定されたセルに対応する画像を表示する処理が行われます。ただし、2つめ以降のレコードについては画像が表示されない問題が発生しています。
  • 画像の表示に関しては、ファイルパスに基づいて画像を読み込み、指定されたセルに表示する処理が行われます。ただし、指定されたファイルパスに存在しない場合、代替の画像が表示されるようになっています。ただし、2つめ以降のレコードについては画像の表示が正常に行われない問題があるようです。
回答を見る
  • ベストアンサー

エクセルを使って、トレーニング名に応じて画像を自動切換表示させたい

Sheet1に、トレーニング名、説明文、画像(jpgファイル名)等の項目を作り、100件以上のレコードが入っている表があります。 Sheet2に、上記の3レコード(=3トレーニング)分のデータをA4用紙に見やすく配置したフォーム(?)を作り、VLOOKUP関数を使って、データを表示させるようにしました。(つまりAトレーニングのトレーニング番号を選ぶとAトレーニングのデータが、Bトレーニングのトレーニング番号を選ぶとBトレーニングのデータが表示) この時、一つ目のレコードについては画像を表示させることができたのですが、2つめ以降のレコードについては画像を表示させることができません。 以下のコードを作成しています。 Private Sub Worksheet_Change(ByVal Target As Range) Dim fName As String, pict As Shape On Error GoTo ER: If Target.Address <> "$C$3" Then Exit Sub fName = ThisWorkbook.Path & "\Image\" & Target.Offset(0, 1).Text If Dir(fName) = "" Then fName = ThisWorkbook.Path & "\Image\NoImage.jpg" End If With ActiveSheet For Each pict In .Shapes If pict.TopLeftCell.Address = "$E$3" Then pict.Delete Exit For End If Next pict Set pict = .Shapes.AddPicture(fName, msoTrue, msoFalse, _ .Range("E3").Left, .Range("E3").Top, 160, 120) End With If Target.Address <> "$C$15" Then Exit Sub fName = ThisWorkbook.Path & "\Image\" & Target.Offset(0, 1).Text If Dir(fName) = "" Then fName = ThisWorkbook.Path & "\Image\NoImage.jpg" End If With ActiveSheet For Each pict In .Shapes If pict.TopLeftCell.Address = "$E$15" Then pict.Delete Exit For End If Next pict Set pict = .Shapes.AddPicture(fName, msoTrue, msoFalse, _ .Range("E15").Left, .Range("E15").Top, 160, 120) End With If Target.Address <> "$C$27" Then Exit Sub fName = ThisWorkbook.Path & "\Image\" & Target.Offset(0, 1).Text If Dir(fName) = "" Then fName = ThisWorkbook.Path & "\Image\NoImage.jpg" End If With ActiveSheet For Each pict In .Shapes If pict.TopLeftCell.Address = "$E$27" Then pict.Delete Exit For End If Next pict Set pict = .Shapes.AddPicture(fName, msoTrue, msoFalse, _ .Range("E27").Left, .Range("E27").Top, 160, 120) End With ER: End Sub ハイパーリンクのように他に飛んで表示させるのではなく、エクセルのその場所に表示させたいと思います。(3トレーニング分をA4用紙で印刷したいと思います) ちなみに画像は、エクセルファイルの置いてある下(サブフォルダ)にまとめて入れております。宜しくお願い致します。

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

  • ベストアンサー
  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.1

>2つめ以降のレコードについては画像を表示させることができません。 コードをじっくり追っていけば直ぐ気づくはずですが。。(^^;;; >If Target.Address <> "$C$3" Then Exit Sub このコードで、セルC3以外は終了になりますよね? 残り2つのセルC15,C27は、何もしないでExit Subへ、ということです。 質問者のコードをそのまま使って修正すると、 '------------------------------------------- If Target.Address = "$C$3" Then   ・・1つ目の処理・・・ ElseIf Target.Address = "$C$15" Then   ・・2つ目の処理・・・ ElseIf Target.Address = "$C$27" Then   ・・3つ目の処理・・・  End If '---------------------------------------------- このように、IF~ElseIF~ 構文を使います。 もちろん、Select Case文とかも使えます。 ●ただ、1つ目、2つ目、3つ目で変るところは、セルアドレスだけですので、 そこを上手く利用するとよりシンプルなコードになります。 例えば、以下のように。。   '---------------------------------------------------------  Private Sub Worksheet_Change(ByVal Target As Range)  Dim fName As String, pict As Shape  On Error GoTo ER:  If Target.Address = "$C$3" Or _    Target.Address = "$C$15" Or _    Target.Address = "$C$27" Then    fName = ThisWorkbook.Path & "\Image\" & Target.Offset(0, 1).Value    If Dir(fName) = "" Then      fName = ThisWorkbook.Path & "\Image\NoImage.jpg"    End If    For Each pict In ActiveSheet.Shapes     If pict.TopLeftCell.Address = Target.Offset(0, 1).Address Then       pict.Delete       Exit For     End If    Next pict    Set pict = ActiveSheet.Shapes.AddPicture(fName, msoTrue, msoFalse, _      Target.Offset(0, 1).Left, Target.Offset(0, 1).Top, 160, 120)  End If ER: End Sub '----------------------------------------------------------- 以上。  

ykdream
質問者

お礼

onlyromさんへ すばやいご回答、本当にありがとうございます。 ご指示頂いたようにVBAを修正してみました。 すると、トレーニングAの横の画像は出て いるのですが、トレーニングB、Cの画像が それぞれのセルに表示されません。 (トレーニングB、Cの選択により、トレーニ ングAの画像が切り替わってしまいます) トレーニングAの画像はE3 トレーニングBの画像はE15 トレーニングCの画像はE27 のようにそれぞれ画像表示したいと思っています。 ============================================================= Private Sub Worksheet_Change(ByVal Target As Range) Dim fName As String, pict As Shape On Error GoTo ER: If Target.Address <> "$C$3" Then fName = ThisWorkbook.Path & "\Image\" & Target.Offset(0, 1).Text If Dir(fName) = "" Then fName = ThisWorkbook.Path & "\Image\NoImage.jpg" End If With ActiveSheet For Each pict In .Shapes If pict.TopLeftCell.Address = "$E$3" Then pict.Delete Exit For End If Next pict Set pict = .Shapes.AddPicture(fName, msoTrue, msoFalse, _ .Range("E3").Left, .Range("E3").Top, 160, 120) End With     (2つ目は文字制限上省略しています) ElseIf Target.Address <> "$C$27" Then fName = ThisWorkbook.Path & "\Image\" & Target.Offset(0, 1).Text If Dir(fName) = "" Then fName = ThisWorkbook.Path & "\Image\NoImage.jpg" End If With ActiveSheet For Each pict In .Shapes If pict.TopLeftCell.Address = "$E$27" Then pict.Delete Exit For End If Next pict Set pict = .Shapes.AddPicture(fName, msoTrue, msoFalse, _ .Range("E27").Left, .Range("E27").Top, 160, 120) End With End If ER: End Sub =============================================================

その他の回答 (6)

  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.7

何度目の登場でしょうか、onlyromです。 >ちなみに入力規制というものが大きな原因になっていたということですが そうです、入力規則のドロップダウンリストを使うと、 Drop Down というコントロールがシートに1つ貼りつきます。 ところがこれは、 If pict.TopLeftCell.Address = "$E$3" Then この、TopLeftCellプロパティを持っていませんし 表面上表示されてないコントロールなので そのコードがエラーとなるわけです。   で、それを回避するために   If Left(pict.Name, 7) = "Picture" Then     If pict.TopLeftCell.Address = "$E$3" Then "Picture"、即ち画像だったら、TopLeftCellを訊く、としているわけです。 これで説明になっていますか? >こういうものを作ればお客様も喜ぶし、 >仕事も簡素化されると思いやっていたのですが、 何事においてもそのような姿勢は非常に大切なことだと思います。 また分からないことがあったら遠慮なく質問してください。 ykdreamさんのように頑張っている人には誰もが親切に回答してくれることでしょう。 以上。  

ykdream
質問者

お礼

onlyromさん  遅い時間までありがとうございました。  最後まで本当にご丁寧にありがとうございました。    ドロップダウンリストが行く手を阻んでいたことが  わかりました。私の基礎的知識が不足していますが、  概要はつかめました。  今回onlyromさんのような方に出逢えて本当に良かった  です。  明日の目覚めが最高の予感がします。  では、おやすみなさい。

  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.6

いまさっき帰宅、晩御飯食べて、早速チェック。 やはり実際のものを見るのが一番ですね。 最初の質問に、番号を入れて、Vlookupと書いてあったので てっきり、番号を手入力しているのかと。。。 まさか、入力規則を使ってるとは思いもしませんでした。 原因はその入力規則です。 理由の説明が必要ですか? ともあれ、いままでのを破棄して、下記コードに入れ替えて実行してください。 お望みどおりに動くはずです。 '--------------------------------------------------- Private Sub Worksheet_Change(ByVal Target As Range) Dim fName As String, pict As Shape If Target.Address = "$C$3" Then   fName = ThisWorkbook.Path & "\Image\" & Target.Offset(0, 1).Text   If Dir(fName) = "" Then     fName = ThisWorkbook.Path & "\Image\NoImage.jpg"   End If   With ActiveSheet   For Each pict In .Shapes     If Left(pict.Name, 7) = "Picture" Then       If pict.TopLeftCell.Address = "$E$3" Then         pict.Delete         Exit For       End If     End If   Next pict   Set pict = .Shapes.AddPicture(fName, msoTrue, msoFalse, _         .Range("E3").Left, .Range("E3").Top, 160, 120)   End With ElseIf Target.Address = "$C$15" Then   fName = ThisWorkbook.Path & "\Image\" & Target.Offset(0, 1).Text   If Dir(fName) = "" Then     fName = ThisWorkbook.Path & "\Image\NoImage.jpg"   End If   With ActiveSheet   For Each pict In .Shapes     If Left(pict.Name, 7) = "Picture" Then       If pict.TopLeftCell.Address = "$E$15" Then         pict.Delete         Exit For       End If     End If   Next pict   Set pict = .Shapes.AddPicture(fName, msoTrue, msoFalse, _         .Range("E15").Left, .Range("E15").Top, 160, 120)   End With ElseIf Target.Address = "$C$27" Then   fName = ThisWorkbook.Path & "\Image\" & Target.Offset(0, 1).Text   If Dir(fName) = "" Then     fName = ThisWorkbook.Path & "\Image\NoImage.jpg"   End If   With ActiveSheet   For Each pict In .Shapes     If Left(pict.Name, 7) = "Picture" Then       If pict.TopLeftCell.Address = "$E$27" Then         pict.Delete         Exit For       End If     End If   Next pict   Set pict = .Shapes.AddPicture(fName, msoTrue, msoFalse, _         .Range("E27").Left, .Range("E27").Top, 160, 120)   End With End If End Sub '---------------------------------------------------- それから、一番最初に言ったように、 3セルの処理とも99%同じ処理ですからひとつに纏めた方がいいでしょう。 そうすれば修正も一箇所ですみますから。 暇を見つけてそういうコードに変更することをお奨めします。 以上。  

ykdream
質問者

お礼

onlyromさんへ  喜びのあまり、叫んでしまいました!!  動きました!!動きました!!!  お食事も束の間、チェックして頂いてありがとうござ  いました。onlyromさんが懇切丁寧にご指導してくれた  お陰です。ほんとうにありがとうございました。  こういうものを作ればお客様も喜ぶし、仕事も簡素化  されると思いやっていたのですが、visual basicは  初心者で、なかなか前に進みませんでした。    大きく前に進めました!ありがとうございました。  ちなみに入力規制というものが大きな原因になっていた  ということですが、もし理由をご説明して頂けるので  したら宜しくお願いします。  一つに纏めたコードについては自分で変更していって  みようと思います。

  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.5

またまたまた登場、onlyromです。 テストの時はOn Errorを外しておくと今回のように上手くいかない原因が明らかになることがあります。 いま補足など読んでみましたが、???という感じですので、帰宅してからまた考えてみたいと思います。 ●一番確実なのは、質問のブックをYahooブリーフケースなどにアップして公開してもらうことです。 もしくは、当方にメール添付していただければ。。。 何れにしろ同じコードで当方では上手くいってるわけですから、あっさりと解決するはずです。 乗りかかった船、解決するまでお付き合いする所存でございまする。 大船(泥舟??)に乗った気持ちでお待ちくだされ。。。(^^;;; 以上。  

ykdream
質問者

お礼

onlyromさんへ 大船にのっている実感があります。 Yhaooブリーフケースに公開しています。 ほんとにほんとにお手数をおかけしますが 宜しくお願いします。 http://briefcase.yahoo.co.jp/bc/mpfnm247/lst?&.dir=/3aae&.src=bc&.view=l ykdreamより

  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.4

またまた登場、onlyromです。 >お忙しいとは思いますが、コメントよろしくお願いします。 忙しくないので、コメントします。。。(^^;;; >しかし、まだトレーニングB、Cの横に画像がでてきません こういうときはも少しはっきりと書かないといけません。 画像自体が出てこないのか、 画像は出るが、ちゃんと決まった場所に出ないのか、など。 コードを一見したところおかしいとこはないようなので、 同じ条件のテストデータで実行してみたところちゃんと動作しました。   で、信用してないわけではないのですが、 質問者が修正したコードは破棄して、 当方がテストした下記コードで実行してみてください。 ブックはコピーして、それを使うというでしょう。  '------------------------------------------------------- Private Sub Worksheet_Change(ByVal Target As Range) Dim fName As String, pict As Shape ●●● ''On Error GoTo ER:  これは省いておくこと If Target.Address = "$C$3" Then fName = ThisWorkbook.Path & "\Image\" & Target.Offset(0, 1).Text If Dir(fName) = "" Then fName = ThisWorkbook.Path & "\Image\NoImage.jpg" End If With ActiveSheet For Each pict In .Shapes If pict.TopLeftCell.Address = "$E$3" Then pict.Delete Exit For End If Next pict Set pict = .Shapes.AddPicture(fName, msoTrue, msoFalse, _ .Range("E3").Left, .Range("E3").Top, 160, 120) End With ElseIf Target.Address = "$C$15" Then fName = ThisWorkbook.Path & "\Image\" & Target.Offset(0, 1).Text If Dir(fName) = "" Then fName = ThisWorkbook.Path & "\Image\NoImage.jpg" End If With ActiveSheet For Each pict In .Shapes If pict.TopLeftCell.Address = "$E$15" Then pict.Delete Exit For End If Next pict Set pict = .Shapes.AddPicture(fName, msoTrue, msoFalse, _ .Range("E15").Left, .Range("E15").Top, 160, 120) End With ElseIf Target.Address = "$C$27" Then fName = ThisWorkbook.Path & "\Image\" & Target.Offset(0, 1).Text If Dir(fName) = "" Then fName = ThisWorkbook.Path & "\Image\NoImage.jpg" End If With ActiveSheet For Each pict In .Shapes If pict.TopLeftCell.Address = "$E$27" Then pict.Delete Exit For End If Next pict Set pict = .Shapes.AddPicture(fName, msoTrue, msoFalse, _ .Range("E27").Left, .Range("E27").Top, 160, 120) End With End If ER: End Sub '--------------------------------------------- テストのときは、●●のOn Error は省いておくのがベターです。 以上。  

ykdream
質問者

お礼

onlyromさんへ  ご丁寧なご指示にほんとに感謝です。  現在のエラー状況を説明します。  1)ご指示いただいたコードをそのままコピペしました。   (On Error は省きました)    2)シートにおいて、トレーニングA部分でトレーニング    内容を選択をすると、一度は画像が出現するのです    が、2回目以降別内容のトレーニングを選択すると、    エラーメッセージが出て画像が変更されません。       ~エラーメッセージ~    実行時エラー"1004"    アプリケーション定義またはオブジェクト定義のエラーです    visual basicのウィンドウを確認すると、    以下の部分が黄色で選択されています。    If pict.TopLeftCell.Address = "$E$3" Then    3)トレーニングB部分、トレーニングC部分には、画像が何も    表示されていない状態です。(ちなみに、トレーニングB、    C部分は、VLOOKUP関数により内容を選択するごとにImage    ファイル名も連動しています。)        以上です。  ほんとにほんとに長いことお付き合いをして頂いて恐縮です。  ありがとうございます。  

ykdream
質問者

補足

onlyromさんへ    エラー状況の追記です。  トレーニングB、C部分で画像が出ておりませんが、  トレーニング内容を選択するとエラー状況2)と同  様のエラーメッセージが出てしまいます。      

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

If Target.Address = "$C$3" Then ElseIf Target.Address = "$C$15" Then ElseIf Target.Address = "$C$27" Then の次の行にブレークポイントを設定して実行してみましょう C15,C27が変更された際にブレークされるか確認し、F8でステップ実行してみましょう

  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.2

再度の登場、onlyromです。 回答をちゃんと見てますか?(^^;;; 先の回答は、   If Target.Address ●=● "$C$3" Then と、比較演算子は、 = ですが、 質問者の修正したコードは、   If Target.Address ■<>■ "$C$3" Then = ではなく、<> のままですよね? そこを修正して実行してください。 以上。    

ykdream
質問者

お礼

onlyromさんへ ご指摘ありがとうござました。〈〉→=に修正しました。 大変失礼しました。 この結果、トレーニングB、Cの選択によりトレーニングAの 画像が切り替わることはなくなりました。しかし、まだトレー ニングB、Cの横に画像がでてきません。。。まだ修正すべき 点を私が見落としているのでしょうか? お忙しいとは思いますが、コメントよろしくお願いします。 ============================================================= Private Sub Worksheet_Change(ByVal Target As Range) Dim fName As String, pict As Shape On Error GoTo ER: If Target.Address = "$C$3" Then fName = ThisWorkbook.Path & "\Image\" & Target.Offset(0, 1).Text If Dir(fName) = "" Then fName = ThisWorkbook.Path & "\Image\NoImage.jpg" End If With ActiveSheet For Each pict In .Shapes If pict.TopLeftCell.Address = "$E$3" Then pict.Delete Exit For End If Next pict Set pict = .Shapes.AddPicture(fName, msoTrue, msoFalse, _ .Range("E3").Left, .Range("E3").Top, 160, 120) End With     (2つ目は文字制限上省略しています) ElseIf Target.Address = "$C$27" Then fName = ThisWorkbook.Path & "\Image\" & Target.Offset(0, 1).Text If Dir(fName) = "" Then fName = ThisWorkbook.Path & "\Image\NoImage.jpg" End If With ActiveSheet For Each pict In .Shapes If pict.TopLeftCell.Address = "$E$27" Then pict.Delete Exit For End If Next pict Set pict = .Shapes.AddPicture(fName, msoTrue, msoFalse, _ .Range("E27").Left, .Range("E27").Top, 160, 120) End With End If ER: End Sub =============================================================

関連するQ&A

  • VBAで同じ作業を2回繰り返す場合のコード

    下記コードで具体的アドバイスを頂ければと思います。よろしくお願いいたします。 ■やりたいこと EXCELのシートに、2種類の写真表示スペースを作って、そのそばでそれぞれファイル名を入力して、そのファイル名を変えるごとに、それぞれのjpegファイルを表示させたい。 ■質問 下記コードで、ふたつめの変数を変えればよいことは、分かるのですが、どこをどのようにして、変数を変えればいいかわかりません。ご教授お願いします。 ■私の作っているコード とあるサイトを参考にして、下記作成いたしました。 'ひとつめ写真表示 Private Sub Worksheet_Change(ByVal Target As Range) Dim fName As String, pict As Shape If Target.Address <> "$H$25" Then Exit Sub fName = ThisWorkbook.Path & "\board_Image\" & Target.Offset(0, 0).Text If Dir(fName) = "" Then fName = ThisWorkbook.Path & "\board_Image\NoImage.jpg" End If With ActiveSheet For Each pict In .Shapes If pict.TopLeftCell.Address = "$C$26" Then pict.Delete Exit For End If Next pict Set pict = .Shapes.AddPicture(fName, msoTrue, msoFalse, _ .Range("k6").Left, .Range("C26").Top, 260, 320) End With End Sub ----------------------------------------------------------------------------- 'ふたつめ写真表示 Private Sub Worksheet_Change(ByVal Target As Range) Dim fName As String, pict As Shape If Target.Address <> "$AT$4" Then Exit Sub fName = ThisWorkbook.Path & "\map_Image\" & Target.Offset(0, 0).Text If Dir(fName) = "" Then fName = ThisWorkbook.Path & "\map_Image\NoImage.jpg" End If With ActiveSheet For Each pict In .Shapes If pict.TopLeftCell.Address = "$k$6" Then pict.Delete Exit For End If Next pict Set pict = .Shapes.AddPicture(fName, msoTrue, msoFalse, _ .Range("k6").Left, .Range("k6").Top, 260, 320) End With End Sub

  • excel vbaの修正でアドバイスお願いします

    excel2000を利用しています。 下記のとあるプロシージャで自分で修正を試みるもどうしても出来ず投稿させていただきました。 どうか修正内容のアドバイスをお願いします。 ■やろうとしていること 下記は写真を表示させる部分のコードです。下記 「worksheetchange」 イベントプロシージャで、レコードが変わると下記「myLoadPicture」が発生し、写真を表示させて、レコードを切り替えるたびに、その写真を切り替えるというものです。 ■相談したいこと いま指定したセルが空白だと、"NoImage.jpg"が表示されるようになっていますが、指定したフォルダに一致するファイルがなかった場合も、"NoImage.jpg"が表示されるようにしたいのですが、修正方法がわかりません。 どうかご教授お願いいたします。 Private Sub Worksheet_Change(ByVal Target As Range) Dim fRange As Range Dim touroku As Long Select Case Target.Address Case "$BC$1" Call hyouji Case "$BW$1" myLoadPicture "board_Image", Target.Text, Range("BH3") Case "$CY$1" myLoadPicture "circuit_Image", Target.Text, Range("CJ3") Case Else Exit Sub End Select End Sub Private Sub myLoadPicture(folderName As String, fname As String, targetRange As Range) On Error Resume Next Dim pict As Shape, picPath As String picPath = ThisWorkbook.Path & "\" & folderName & "\" & fname If fname = "" Then picPath = ThisWorkbook.Path & "\" & folderName & "\" & "NoImage.jpg" End If With ActiveSheet For Each pict In .Shapes If pict.TopLeftCell.Address = targetRange.Address Then pict.Delete Exit For End If Next pict Set pict = .Shapes.AddPicture(picPath, msoTrue, msoFalse, _ targetRange.Left, targetRange.Top, 260, 320) End With Exit Sub End Sub

  • excel VBA のエラー回避のアドバイス依頼

    いつもお世話になります。 EXCEL2000のVBAで、エラーになった場合の修正(回避コード)を教えていただきたくよろしくお願いいたします。 ここでは、とあるブックのSheet1のH25セルに写真のファイル名を入れます。そして、実際の写真を ブックが保管してあるフォルダ内のboard_image というフォルダに入れて、マクロを実行すると、C26セルに写真が表示されるというものですが。 ここで、C26セルが空白だと「実行時エラー'1004!; 指定したファイルが見つかりませんでした。」と言われます。 これを回避して、「NoImage.jpg」という名前の写真を表示させるようにしたいです。 アドバイスお願いします。 '■↓コードは下記です。 Private Sub Worksheet_Change(ByVal Target As Range) Dim fRange As Range Dim touroku As Long Select Case Target.Address Case "$H$25" myLoadPicture "board_Image", Target.Text, Range("C26") Case Else Exit Sub End Select End Sub Private Sub myLoadPicture(folderName As String, fname As String, targetRange As Range) Dim pict As Shape, picPath As String picPath = ThisWorkbook.Path & "\" & folderName & "\" & fname If Dir(picPath) = "" Then picPath = ThisWorkbook.Path & "\" & folderName & "\" & "NoImage.jpg" End If With ActiveSheet For Each pict In .Shapes If pict.TopLeftCell.Address = targetRange.Address Then pict.Delete Exit For End If Next pict Set pict = .Shapes.AddPicture(picPath, msoTrue, msoFalse, _ targetRange.Left, targetRange.Top, 300, 360) End With End Sub

  • エクセルの画像リンク解除

    Pictures.Insert で書かれた内容を Shapes.AddPicture の構文に変更したいのですが、 VBAの知識が乏しいので、なかなかうまくいきません。 どなたかわかる方はいらっしゃいますでしょうか? 宜しくお願いします。 Sub Test() Range("B3").Select Dim fName, pict As Picture fName = Application.GetOpenFilename("JPG, *.jpg", MultiSelect:=True) If IsArray(fName) Then For i = 1 To UBound(fName) Set pict = ActiveSheet.Pictures.Insert(fName(i)) pict.TopLeftCell = ActiveCell pict.Width = ActiveCell.Width * 2 pict.Height = ActiveCell.Height * 6 ActiveCell.Offset(7, 0).Activate Next i End If End Sub

  • エクセルに画像挿入

    以前の投稿で下記のようなVBAを拝見しました。 実行するとA列に画像ファイル名、B列に画像が縦に配置されます。 これを横に配置するにはどうすればいいのでしょうか? 初心者なので質問不足かもしれませんがよろしくお願いします。 Sub PictAdd() Dim pict As Shape, r As Range With Application.FileSearch  .NewSearch  .LookIn = ThisWorkbook.Path  .SearchSubFolders = False  .Filename = "*.jpg"  If .Execute() > 0 Then   For i = 1 To .FoundFiles.Count    Set r = ActiveSheet.Range("B" & i)    Set pict = ActiveSheet.Shapes.AddPicture _       (.FoundFiles(i), msoTrue, msoFalse, _        r.Left, r.Top, r.Width, r.Height)       pict.OnAction = "PictClick"       r.Offset(0, -1).Value = Dir(.FoundFiles(i))   Next i  End If End With  Columns(1).EntireColumn.AutoFit End Sub

  • Excelでシート名と最終更新日を自動表示したい

    Excelを使って (1)セルA1に入れた名目をシート名にし (2)セルH1には、最終更新日を自動で入れたいです。 調べた結果、 シート名を右クリックして「コードの表示」から (1)は Private Sub Worksheet_Change(ByVal Target As Range) Sheets(1).Name = Range("B1") End Sub を入れてうまくいきましたが、 (2)は Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)  If ThisWorkbook.Saved = False Then   Worksheets("Sheet1").Range("H1").Value = Date  End If End Sub を入れてみましたが(←調べましたもの) うまくいきませんでした。 単純に、 Private Sub Worksheet_Change(ByVal Target As Range) Sheets(1).Name = Range("B1") End Sub Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)  If ThisWorkbook.Saved = False Then   Worksheets("Sheet1").Range("H1").Value = Date  End If End Sub とつなげて入れるのではだめなんでしょうか? それとも、(2)の何かが間違っていますか? ご教授願います。

  • フォルダー内のファイルのリンク VBA

    以前、カーソールを置いた部分のテキストとフォルダーの中にあるファイルが一致した場合、 ボタンを押す事によりハイパーリンクを付けるVBAを教えて頂き、現在も活用をさせて頂いています。 今までエクセル「E」列を対象にしていたのですが、 使用しているうちに前列に項目を入れたくなり「E」列の前に2列追加し、 対象の列が「E」列から「G」列の変更になりました。 それから新たにリンクを作成しようとしても実行出来なくなりました。 追加した前列を消しても駄目に。 素人なりに列を指定しているところを変えてみたのですが駄目でして。 If .Column <> 5 Or .Value = "" Then Exit Subを If .Column <> 7 Or .Value = "" Then Exit Subに。 列を変えた場合は、何処をどうすれば良いのでしょうか? 申し訳ありませんが、教えて頂けないでしょうか? 元のVBA Sub Test() Dim fName As String fName = ThisWorkbook.path & "\test\test-a\" With ActiveCell If .Column <> 5 Or .Value = "" Then Exit Sub fName = fName & .Offset(0, -4).MergeArea.Cells(1, 1).Value & _ "\" & .Value & ".prt" If Dir(fName) <> "" Then ActiveSheet.Hyperlinks.Add Anchor:=ActiveCell, Address:=fName End If End With End Sub

  • エクセルVBAについて

    http://okwave.jp/qa/q7236213.html 上記質問の発展形なのですが 同様のことを E列に日付 F列に売上 G列に結果 でやりたいのですが この時A列~C列のマクロも残したままでしたいのですが 下記のように同様のプロシージャーを下段に書けばできると思ったのですが うまくいきません。 Private Sub worksheet_change(ByVal Target As Excel.Range) If Target.Address <> "$A$1" Then Exit Sub If Target = "" Then Exit Sub Range("C10:C65536").ClearContents With Range(Cells(9 + Range("A1").Value, "C"), Cells(Range("A65536").End(xlUp).Row, "C")) .FormulaR1C1 = "=MAX(RC2:R[" & -Range("A1").Value + 1 & "]C2,FALSE)" .Value = .Value End With End Sub Private Sub worksheet_change(ByVal Target As Excel.Range) If Target.Address <> "$E$1" Then Exit Sub If Target = "" Then Exit Sub Range("G10:G65536").ClearContents With Range(Cells(9 + Range("E1").Value, "G"), Cells(Range("E65536").End(xlUp).Row, "G")) .FormulaR1C1 = "=MAX(RC6:R[" & -Range("A1").Value + 1 & "]C6,FALSE)" .Value = .Value End With End Sub どなたかお知恵を拝借できませんでしょうか?

  • エクセルのコード表示についてですが。。

    Private Sub Worksheet_Change(ByVal Target As Range) (1)If Target.Column <> 4 Then Exit Sub Target.Offset(0, -3) = Now()   ⇒特定のセルに日時自動表示 (2)If Target.Column <> 4 Then Exit Sub  Target.Offset(0, 1) = "DUMMY"  ⇒特定のセルにDUMMYと自動表示 (3)If Target.Column = 4 Then  Target.Offset(0, -2) = "1"  Else             ⇒特定のセルに1と自動表示   (4)If Target.Column = 35 Then  Target.Offset(0, -2) = "2"  ⇒特定のセルに2と自動表示  End If  End If (5)If Target.Value = "T" Or Target.Value = "t" Then  Target.Value = "田中"    ⇒Tと入力すると田中と変換して表示  ElseIf Target.Value = "H" Or Target.Value = "h" Then  Target.Value = "林"     ⇒hと入力すると林と変換して表示  End If  End Sub 上のようなコードを入力すると(3)と(5)が機能しません。。なぜでしょうか??コードの表示がまずいのでしょうか??

  • 【エクセルマクロ】画像挿入について教えてください。

    Excel2010で下記マクロを実行し、 画像挿入元のフォルダ名を変更・削除したり、メールに添付して送信したりすると「リンクされたイメージを表示できません。ファイルが移動または削除されたか、名前が変更された可能性があります。リンクに正しいファイル名と場所が指定されていることを確認してください。」 と表示されます。 Excel2010では、Shapes.Addメソッドを使用するとリンク解除ができるとのことで、 初心者ながら色々試してみたのですが、うまくいきません。 マクロ初心者のため、詳しく教えていただけると大変助かります。 Private Sub Del_Btn_Click() 指定セル範囲 = "C18:K500" With ActiveSheet Set セル範囲 = .Range(指定セル範囲) For Each 図形 In .Shapes If 図形.Type = msoPicture Then Set 共有セル範囲 _ = Intersect(Range(図形.TopLeftCell, 図形.BottomRightCell), セル範囲) If Not (共有セル範囲 Is Nothing) Then 図形.Delete End If End If Next End With End Sub Private Sub Ins_Btn_Click() Dim fName As Variant Dim i As Long Dim j As Integer Dim k As Integer Dim Pict As Picture Const z1 As Long = 246 'サイズ指定 Const z2 As Long = 184 'サイズ指定 Dim z3 As Long '上位置 z3 = 306 k = 1 fName = Application.GetOpenFilename("JPGファイル, *.jpg", MultiSelect:=True) If IsArray(fName) Then Application.ScreenUpdating = False '配列に格納されたファイル名をソート BubbleSort fName, True 'If UBound(fName) >= 19 Then ' j = 19 ' Else j = UBound(fName) 'End If For i = 1 To j Set Pict = ActiveSheet.Pictures.Insert(fName(i)) If i Mod 6 = 5 Then z3 = z3 + 18.5 - k k = k + 0.5 End If If i Mod 2 = 1 Then With Pict .Width = z1 '横型 .Height = z2 '縦型 .Top = z3 + 146.5 * (i - 1) '上位置 .Left = 83 '左位置 .Locked = False ico = ico + z1 + 10 '間隔指定 End With Else With Pict .Width = z1 '横型 .Height = z2 '縦型 .Top = z3 + 146.5 * (i - 2) '上位置 .Left = 350 '左位置 .Locked = False ico = ico + z1 + 10 '間隔指定 End With End If ActiveCell.Offset(2, 0).Activate Application.StatusBar = "処理中:" & i & "/" & UBound(fName) & "枚目" Next i End If With Application .StatusBar = False .ScreenUpdating = True End With Set Pict = Nothing If i > 0 Then MsgBox j & "枚の画像を挿入しました", vbInformation End If End Sub '値の入替え Public Sub Swap(ByRef Dat1 As Variant, ByRef Dat2 As Variant) Dim varBuf As Variant varBuf = Dat1 Dat1 = Dat2 Dat2 = varBuf End Sub '配列のバブルソート Public Sub BubbleSort(ByRef aryDat As Variant, _ Optional ByVal SortAsc As Boolean = True) Dim i As Long Dim j As Long For i = LBound(aryDat) To UBound(aryDat) - 1 For j = LBound(aryDat) To LBound(aryDat) + UBound(aryDat) - i - 1 If aryDat(IIf(SortAsc, j, j + 1)) > aryDat(IIf(SortAsc, j + 1, j)) Then Call Swap(aryDat(j), aryDat(j + 1)) End If Next j Next i End Sub どうぞよろしくお願いいたします。