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

このQ&Aのポイント
  • VBAを使用してEXCELのシートに2種類の写真表示スペースを作成し、ファイル名の変更に応じてそれぞれのjpegファイルを表示させる方法を教えてください。
  • 下記のVBAコードを使用して、Excelのセルにファイル名を入力すると、そのファイルを表示するための画像が表示されます。ふたつめの写真表示について、どこをどのように変更すればいいか教えてください。
  • VBAを使用して、Excelのシートに2つの写真表示スペースを作成し、それぞれのファイル名に基づいて画像を表示する方法を教えてください。ふたつめの写真表示に関して、変更すべき箇所と具体的な変更内容を教えてください。
回答を見る
  • ベストアンサー

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

  • puyopa
  • お礼率87% (459/525)

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

  • ベストアンサー
  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.5

#2,4です。 >新たなイベントを用意して、やれば、いいということですね。 イベントに対する処理を下請けに出しているだけで、新たなイベントという訳ではありません。 >loadpicture(myはいりますかね?) ユーザーフォームに画像を読みこむloadpictureというVBAの機能がありますので、それと区別するためにmyをつけています。 >さらに別フォルダでもう一箇所写真表示箇所を増やそうと思ったら、どういう関数が使えますでしょうか? 下記の通り、お好きなだけ場合分けを追加していただければ結構です。 「どういう関数を使う」という訳ではなくて、自分で定義した関数(正確な表現ではありませんが、便宜上)に渡す引数を変えて、何度でも呼び出してやれば良いです。これが、繰り返し作業を関数にまとめるメリットです。 以上、ご参考まで。 Select Case Target.Address Case "$H$25" myLoadPicture "board_Image", Target.Text, Range("C26") Case "$AT$4" myLoadPicture "map_Image", Target.Text, Range("K6") Case "$A$50" myLoadPicture "hoge_Image",Target.Text,Range("A100") Case "$B$1" myLoadPicture ..... (以下、お好きなだけ追加) Case Else Exit Sub End Select

puyopa
質問者

お礼

無知な私の度重なる質問に答えていただき、ありがとうございました。 じっくりと拝見させていただき。なんとか理解できました。 汎用性、応用も利く、とても素晴らしいコードだと思います。私は本当に幸運です。 本当にありがとうございました。

その他の回答 (4)

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.4

#2です。フォルダー名の相違は見落としておりました。(試運転でエラーが出ておかしいなとは思ったのですが、詰めが甘かった...) 別関数にしているので、こういう仕様の変更(オイオイ、見落としておいて)への対処は楽かもしれません。 Private Sub Worksheet_Change(ByVal Target As Range) Select Case Target.Address Case "$H$25" myLoadPicture "board_Image", Target.Text, Range("C26") Case "$AT$4" myLoadPicture "map_Image", Target.Text, Range("K6") 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, 260, 320) End With End Sub

puyopa
質問者

お礼

なるほど、Worksheet_Changeが使えない代わりに、loadpicture(myはいりますかね?)という、新たなイベントを用意して、やれば、いいということですね。 未熟な私にも分かりやすかったです。ありがとうございます。 さらにずうずうしく質問ばっかりで、ごめんなさい。さらに別フォルダでもう一箇所写真表示箇所を増やそうと思ったら、どういう関数が使えますでしょうか? 差し支えなければ、教えていただければ幸いです。

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.3

まず,2つのセル用のマクロを2つ並べて記載しても動かないので,「両方の」マクロを消します。 次のマクロに差し替えます。 private sub worksheet_change(byval Target as excel.range)  dim fName as string  dim h0 as Range, h as range ’記入セルを必要に応じて直すこと  set h0 = application.intersect(target, range("H25,AT4"))  if h0 is nothing then exit sub  on error resume next  for each h in h0   fname = thisworkbook.path & "\board_Image\" & h.text   ff dir(fname) = "" Then    fname = thisworkbook.path & "\board_Image\NoImage.jpg"   end if   activesheet.shapes("pict_" & h.address).delete   if h <> "" Then  ’画像の配置位置・大きさは必要に応じて直すこと   activesheet.shapes.addpicture(fname, msotrue, msofalse, _   range("k6").left, _   range(iif(h.address = "$H$25", "K26", "K6")).top, _   260, 320).name = "pict_" & h.address   end if  next end sub #補足 今のマクロはアタリマエのように一つのセルに入力する事を想定していますが,必ずしもそうとは限らないので対処します。 セルの記入内容を削除したときの動作も少し直しています

puyopa
質問者

お礼

回答ありがとうございます。 こんなにたくさんの方の有識者にアドバイスいただけてとても幸せです。皆様本当にありがとうございます。 keithin様 一番短くて、分かりやすそうなプログラムだったのですが、残念ながらコンパイルエラーが出てしまいました。 そして自分で直そうとしまいましたが、直せませんでした。 甘えてばっかりで恐縮ですが、ご確認頂ければ幸いです。

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.2

If pict.TopLeftCell.Address = "$C$26" で判断して、既存の画像を削除している事から、下記の"k6"は誤りと判断させていただきました。 Set pict = .Shapes.AddPicture(fName, msoTrue, msoFalse,.Range("k6").Left, .Range("C26").Top, 260, 320) それを前提としたコードです。ご参考まで。 Private Sub Worksheet_Change(ByVal Target As Range) Dim fname As String If Target.Address <> "$H$25" And Target.Address <> "$AT$4" Then Exit Sub fname = ThisWorkbook.Path & "\board_Image\" & Target.Text If Dir(fname) = "" Then fname = ThisWorkbook.Path & "\board_Image\NoImage.jpg" End If Select Case Target.Address Case "$H$25" myLoadPicture fname, Range("C26") Case "$AT$4" myLoadPicture fname, Range("K6") End Select End Sub Private Sub myLoadPicture(fname As String, targetRange As Range) Dim pict As Shape 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(fname, msoTrue, msoFalse, _ targetRange.Left, targetRange.Top, 260, 320) End With End Sub

puyopa
質問者

お礼

mitarashi様 回答ありがとうございました。 ご提示いただいたプログラムで写真はうまく表示できました。すごくありがたいです。 ※但し、NO1の回答者様と同じで恐縮なのですが、 写真を格納するファイルですが「board_Image」と「map_Image」があり、出来れば、一つ目と二つ目から、それぞれのフォルダへ読み込めるようにしたいのですが、ここもプログラムに反映する方法を教えていただければと思います。

  • jcctaira
  • ベストアンサー率58% (119/204)
回答No.1

puyopaさん こんにちは。 ワークシートイベントは1つしか指定できません。 Private Sub Worksheet_Change(ByVal Target As Range) よって、Targetの内容により場合分けして処理をすればよいです。 ・Targetが$H$25の時 ・Targetが$K$6の時 ・それ以外の時 また、プログラムの修正は「ひとつめ写真表示」と「ふたつめ写真表示」の違う部分を 変数化にすれば良いです。 puyopaさんのプログラムを変更したサンプルです。 ※テストはしていませんので、内容を再度確認してください。 Private Sub Worksheet_Change(ByVal Target As Range)  Dim fName As String, pict As Shape  Dim Topセル As String  Select Case Target.Address   Case "$H$25"    Topセル = "$C$26"   Case "$AT$4"    Topセル = "K$6$"   Case Else    Exit Sub  End Select  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 = Topセル Then     pict.Delete     Exit For    End If   Next pict   Set pict = .Shapes.AddPicture(fName, msoTrue, msoFalse, _     .Range("K6").Left, .Range(Topセル).Top, 260, 320)  End With End Sub

puyopa
質問者

お礼

jcctaira様 早速の回答ありがとうございます。大変ありがたいです。おかげさまでイベントプロシージャをひとつにまとめるという所はなんとか理解できました。 甘えてばっかりで、恐縮なのですが、もう2点質問させてください。 (1点目) 回答者様がご提示いただいた 最後から3~4行目で「アプリケーション定義またはオブジェクト定義のエラーです。」とエラーが出るのですが、どこが誤りか自分では見つけられませんでした。教えていただければ幸いです。   Set pict = .Shapes.AddPicture(fName, msoTrue, msoFalse, _     .Range("K6").Left, .Range(Topセル).Top, 260, 320) (2点目) 写真を格納するファイルですが「board_Image」と「map_Image」があり、出来れば、一つ目と二つ目から、それぞれのフォルダへ読み込めるようにしたいのですが、ここもプログラムに反映する方法を教えていただければと思います。 甘えてばっかりで恐縮ですが、よろしくお願いいたします。

関連するQ&A

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

    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用紙で印刷したいと思います) ちなみに画像は、エクセルファイルの置いてある下(サブフォルダ)にまとめて入れております。宜しくお願い致します。

  • 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でコードの編集が上手くいきません

    先日、ご回答頂いたコードを元に自分でいじっているのですが上手く行きません 自分が変更したコード シート1→シート名:変更箇所 Private Sub worksheet_change(ByVal Target As Excel.Range) If Target.Address <> "$C$40" Then Exit Sub If Target = "" Then Worksheets("リスト").AutoFilterMode = False: Exit Sub Worksheets("リスト").Range("A:C").AutoFilter field:=1, Criteria1:=Target.Value If Target.Address <> "$C$42" Then Exit Sub If Target = "" Then Worksheets("リスト").AutoFilterMode = False: Exit Sub Worksheets("リスト").Range("A:C").AutoFilter field:=1, Criteria1:=Target.Value If Target.Address <> "$C$44" Then Exit Sub If Target = "" Then Worksheets("リスト").AutoFilterMode = False: Exit Sub Worksheets("リスト").Range("A:C").AutoFilter field:=1, Criteria1:=Target.Value End Sub シート2→シート名:リスト Private Sub worksheet_change(ByVal Target As Excel.Range) Dim i As Long, c As Long Dim h As Range, ha As Range Dim myDic As Object Set ha = Application.Intersect(Target, Range("A:C")) If ha Is Nothing Then Exit Sub Set ha = Application.Intersect(ha.EntireColumn, Range("1:1")) For Each h In ha Set myDic = CreateObject("Scripting.Dictionary") If h.Column = 1 Then c = 3 'A列→C列 If h.Column = 2 Then c = 4 'B列→D列 If h.Column = 3 Then c = 6 'C列→F列 On Error Resume Next For i = 2 To Cells.SpecialCells(xlCellTypeLastCell).Row If Cells(i, h.Column) <> "" Then myDic.Add Cells(i, h.Column).Value, Cells(i, h.Column).Value End If Next i With Worksheets("変更箇所").Cells(40, c).EntireColumn.Validation .Delete .Add Type:=xlValidateList, Formula1:=Join(myDic.keys, ",") End With Set myDic = Nothing Next End Sub シート1において$C$40または$C$42または$C$44のいずれかを変更した場合 最後に変更したセルに対し、シート2にオートフィルタ―がかかる様にしたいと思っています。 試しにシート1を以下のように編集したところ、思った動作を行ったのですが $C$40または$C$42または$C$44のいずれかのセルを空白にすると エラーがでてしまいます。 Private Sub worksheet_change(ByVal Target As Excel.Range) If Target = "" Then Worksheets("リスト").AutoFilterMode = False: Exit Sub Worksheets("リスト").Range("A:C").AutoFilter field:=1, Criteria1:=Target.Value If Target = "" Then Worksheets("リスト").AutoFilterMode = False: Exit Sub Worksheets("リスト").Range("A:C").AutoFilter field:=1, Criteria1:=Target.Value If Target = "" Then Worksheets("リスト").AutoFilterMode = False: Exit Sub Worksheets("リスト").Range("A:C").AutoFilter field:=1, Criteria1:=Target.Value End Sub Then Exit 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 どなたかお知恵を拝借できませんでしょうか?

  • EXCEL VBA エラーの意味が分からず

    いつも、お世話になっております。 下記コードで、レコード1と2を前へと次へを繰り返し何度か操作すると、エラーになってしまいます。なぜエラーになって、どう修正すれば回避できるのかが分かりません。 どうかご教授いただけないでしょうか。よろしくお願いいたします。 エラーの状況 inputシートで、maeとtsugiの動作を何度か行うと、「If pict.TopLeftCell.Address = targetRange.Address Then」の部分が黄色く塗りつぶされ、「実行時エラー1004 アプリケーション定義またはオブジェクト定義のエラーです。」と表示されてしまします。たぶん写真の削除の時にエラーになっているのだと思いますが、 '■標準モジュールのコード。dataシートのレコードを移動し、inputシートのBC1セルに表示する。 Public trg As Range Sub Saisyo() Set trg = Worksheets("data").Range("A1") Do Set trg = trg.Offset(1, 0) Loop Until trg.EntireRow.Hidden = False Call Tenki End Sub Sub Saigo() Set trg = Worksheets("data").Range("A60000").End(xlUp) Call Tenki End Sub Sub Mae() On Error GoTo errhandle If trg.row >= 3 Then Do Set trg = trg.Offset(-1, 0) Loop Until trg.EntireRow.Hidden = False If trg.row = 1 Then MsgBox "これより前のレコードはありません" Call Saisyo Exit Sub Else Call Tenki End If Else MsgBox "これより前のレコードはありません!" End If Exit Sub errhandle: Call Saisyo End Sub Sub Tsugi() On Error GoTo errhandle If trg.row < Worksheets("data").Range("A60000").End(xlUp).row Then Do Set trg = trg.Offset(1, 0) Loop Until trg.EntireRow.Hidden = False Call Tenki Else MsgBox "これより後ろのレコードはありません" End If Exit Sub errhandle: Call Saigo End Sub Sub Tenki() Worksheets("input").Range("BC1").Value = trg.Offset(0, 0) End Sub '■sheet 1のモジュール。inputシートBC1セルの値を見て、dataシートへ値を読みにいき、inputシートへ表示する。 Private Sub hyouji() Dim fRange As Range Dim kensaku As Long Set fRange = Sheets("data").Columns(1).Find(What:=Range("BC1").Value, _ LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows) If (fRange Is Nothing) Then '見つからなかった? MsgBox "入力された顧客コードが存在しません。", vbExclamation Exit Sub End If kensaku = fRange.row '検索された顧客DCの行位置を求める Range("BC1:BE1").Value = Sheets("data").Cells(kensaku, 1).Value '整理No Range("AX1").Value = Sheets("data").Cells(kensaku, 2).Value '固有ID Range("I4").Value = Sheets("data").Cells(kensaku, 3).Value '工場名 Range("P4").Value = Sheets("data").Cells(kensaku, 4).Value '柱No Range("W4").Value = Sheets("data").Cells(kensaku, 5).Value '盤No Range("I5").Value = Sheets("data").Cells(kensaku, 6).Value '変台系統1 Range("S5").Value = Sheets("data").Cells(kensaku, 7).Value '変台系統2 Range("I6").Value = Sheets("data").Cells(kensaku, 8).Value '分電盤設置時期 Range("B8").Value = Sheets("data").Cells(kensaku, 9).Value '主な供給先 Range("B14").Value = Sheets("data").Cells(kensaku, 10).Value '特記 Range("AD4").Value = Sheets("data").Cells(kensaku, 11).Value '盤位置の目安 Range("AT8").Value = Sheets("data").Cells(kensaku, 12).Value '幹線線相 Range("R36").Value = Sheets("data").Cells(kensaku, 13).Value '盤写真ファイル名 Range("AT36").Value = Sheets("data").Cells(kensaku, 14).Value '単結図ファイル名 End Sub '■sheet 1のモジュール。"$R$36"と"$AT$36"の写真ファイル名を見て、"C37"と"AE37"セルに表示させる。 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 "$R$36" myLoadPicture "board_Image", Target.Text, Range("C37") Case "$AT$36" myLoadPicture "map_Image", Target.Text, Range("AE37") Case "$AT$8" Call red_circle 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 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, 300, 360) End With End Sub

  • 2つのVBAを組み合わせる方法

    お世話になります、2つのVBAを組み合わせる方法で迷っています。 1つ目が Private Sub Worksheet_Change(ByVal Target As Range) Dim i As Long, k As Long, myNum As Long If Intersect(Target, Range("C1,B9:B39")) Is Nothing Or Target.Count > 1 Then Exit Sub Application.EnableEvents = False With Target If .Column = 3 Then myNum = WorksheetFunction.Max(Range("B9:B39")) If IsDate(.Value) Then For i = 9 To 39 If Cells(i, "A").Value = "" Then Cells(i, "B").Value = "" Else Cells(i, "B") = myNum + i - 8 End If Next i End If Else i = .Row If .Value = "" Then Range(Cells(i + 1, "B"), Cells(39, "B")).ClearContents Else For k = i + 1 To 39 If Cells(k, "A").Value = "" Then Cells(k, "B").Value = "" Else Cells(k, "B") = Cells(k - 1, "B") + 1 End If Next k End If End If End With Application.EnableEvents = True End Sub です。 2つめが Private Sub Worksheet_Change(ByVal Target As Range)  Application.EnableEvents = True If Intersect(Target, Range("R8:R38")) Is Nothing Then Exit Sub Application.EnableEvents = False Range(Cells(Target.Row, 18), Cells(39, 18)).Value = Target.Value Application.EnableEvents = True End Sub です。2つのPrivate Sub Worksheet_Change(ByVal Target As Range)イベントのVBAですが、どのようにして組み合わせれば良いのでしょうか?

  • フォルダー内のファイルのリンク 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

  • excel 2007 VBA コードの記述

    Excel 2007 を使用しています。 TEST.xlsm というブック内に テスト01 というシートを作成し、そのタブを右クリックして コードの表示 を選択。 表示されたVBAコード入力シートに下記のコードを記述して使用してます。 Private Sub Worksheet_Change(ByVal Target As Range) 'この行から If Intersect(Target, Range("E3:E33,G3:G33,AH3:AH33,AJ3:AJ33,BK3:BK33,BM3:BM33")) Is Nothing Or Selection.Count <> 1 Then Exit Sub Application.EnableEvents = False If Target <> "" Then If IsNumeric(Target) Then Target = Target - 23 End If End If Application.EnableEvents = True End Sub 'この行まで この条件に新たに下記のコードを追加したいと思い ネット検索しながらあれこれ試行錯誤してますが まだまだVBA初心者のため上手く機能してくれません。 ※上のコードだけなら思った通りに機能します。 Private Sub Worksheet_Change(ByVal Target As Range) 'この行から If Intersect(Target, Range("Y3:Y33,BB3:BB33,CE3:CE33")) Is Nothing Or Selection.Count <> 1 Then Exit Sub Application.EnableEvents = False If Target <> "" Then If IsNumeric(Target) Then Target = Target - 30 End If End If Application.EnableEvents = True End Sub 'この行まで どなたかこれら二種のコードを一つにまとめた記述方法を 教えて頂けますでしょうか?

専門家に質問してみよう