マクロ 複数のシートに適用する記述がわかりません

このQ&Aのポイント
  • マクロを複数のシートに一括適用する方法についての質問です。シート3からシート33まで同じ処理を行いたいのですが、現在の記述ではうまく動作しません。解決方法を教えてください。
  • シート3からシート33まで同じ処理を一括適用するマクロが必要です。現在の記述ではエラーが発生してしまいます。どの部分を修正すれば良いでしょうか?お知恵を拝借したいです。
  • 複数のシートに同じ処理を適用するマクロを作成していますが、エラーが出てしまい解決できません。シート3からシート33までの範囲で処理を行いたいのですが、どのように修正すれば良いでしょうか?ご教示いただけると助かります。
回答を見る
  • ベストアンサー

マクロ 複数のシートに適用する記述がわかりません

いつも皆様方にはたいへんお世話になっております。 下記のマクロをシート3~33(同じ構造です)まで、適用したいのですが、一つ一つのシートに貼り付けていけばよいのですが、なんとか一つの記述で出来ないかと、以前この質問コーナーでの回答を寄せ集めて、記述したのですが、コンパイルエラーばかりで、どうにもなりません。 こんな初歩的なことは、最小限の勉強で解決出来るのかも知れませんが、どうにもなりません。 誠に恐縮ですが、下記の記述の「どこを」「どの様に」修正したらよいか、どなたか解る方、教えて頂けないでしょうか。 どうぞ、よろしくお願いいたします。 Private Sub worksheet_change(ByVal Target As Excel.Range) Dim sheetno As Integer          ←この3行を当てずっぽうで挿入してみました><; For sheetno = 3 To 33 Worksheets(sheetno).Select h As Range Set Target = Application.Intersect(Target, Range("E5:N12, E14:N22, E24:N28, E30:N34")) On Error Resume Next For Each h In Target If h <> "" Then Application.EnableEvents = False h = Application.VLookup(h.Value, Worksheets("マクロリスト表").Range("A:B"), 2, False) Application.EnableEvents = True End If Next End Sub

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

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

同じマクロをダブって登録はできませんので,それではこの方法は使えません。 諦めて各シートに元のマクロを登録する方法に戻すか,またはこれまでThisWorkbookに登録していたWorkbook_Sheetchangeマクロを消して(=それを別のやり方に変えて)今回のマクロを使うか,または,がんばって2つのマクロの機能を1つのマクロに統合してください。 がんばって2つのマクロの機能を1つのマクロに統合するとは,つまり「具体的に」どんなシート構成にしていて,「具体的に」どんなシート名が並んでいて,どのシートでは何をしたい,そういったあなたのヤリタイ具体的な作業に照らして,適切にマクロの書きぶりを修正するということです。

yamagou
質問者

お礼

いつも、ご回答いただきありがとうございます。 せっかく、お手数をおかけしましたが、今回は各シートに元のマクロを登録することで、当面の解決策といたします。 しかし、2つを統合する方事が出来るなら、コツコツとちゃれんじして見ようと思っています。ありがとう、ございました。

その他の回答 (1)

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

各シートのシート名タブ右クリックでコードの表示で表示したシートのマクロは「全て消去しておく」 VBE画面でプロジェクトエクスプローラから,当該のブックに含まれている「ThisWorkbook」モジュールをWクリックする 現れたシートに下記をコピー貼り付ける private sub Workbook_SheetChange(byval Sh as object, byval Target as excel.range)  if sh.index < 3 or sh.index > 33 then exit sub  set target = application.intersect(target, sh.range("E5:N12,E14:N22,E24:N28,E30:N34"))  if target is nothing then exit sub  on error resume next  for each h in target   if h <> "" then    application.enableevents = false    h.value = application.worksheetfunction.vlookup(h.value, worksheets("マクロリスト表").range("A:B"), 2, false)    application.enableevents = true   end if  next end sub ファイルメニューから終了してエクセルに戻る 3~33枚目のシートの所定のセルに記入すると,「そのシートに限り」書き換える。 #捕捉 「3~33枚目のシート」とは,シート名タブを左から数えて1枚目,2枚目,3枚目という意味です。 シート名ではないので間違えないように気をつけてください。

yamagou
質問者

補足

早速、お答え頂きましてありがとうございます。 ご指示にしたがい実行しましたところ、 コンパイルエラー  名前が適切ではありません:Workbook_SheetChange と出まして、ヘルプを見ますと 名前が適切ではありません。 識別子が別の識別子と競合しているか、または修飾が必要です。・・・ と書かれています。 下記のように、先に同じシート範囲にマクロがあり、重複してしまったせいでしょうか? 最初に、「ThisWorkbook」モジュールのすでに下記の様なマクロがあることを、記入するべきでした。 私の知識があまりにも初心者過ぎて、何に留意して質問したらよいか、今ひとつつかめなくて、ご迷惑をおかけしております。 お忙しいところ、申し訳ありませんが、対処法をお教え願えないでしょうか。 よろしくお願いいたします。 先にあったマクロ Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Excel.Range) If Sh.Name = "勤務表" Or Sh.Name = "勤務表データ" Or Sh.Name = "マクロリスト表" Or Sh.Name = "マニュアル" Or Sh.Name = "データシート" Then Exit Sub If Target.Address <> "$U$1" Then Exit Sub '以前やったとおり、マクロをトリガする「実入力セル」の番地を記載する事 If Sh.Range("$U$1") = "" Then Exit Sub On Error GoTo errhandle Sh.Name = Sh.Range("$U$1").Text Exit Sub errhandle: MsgBox "BAD SHEET NAME" End Sub 今回のマクロ Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Excel.Range) If Sh.Index < 3 Or Sh.Index > 33 Then Exit Sub Set Target = Application.Intersect(Target, Sh.Range("E5:N12,E14:N22,E24:N28,E30:N34")) If Target Is Nothing Then Exit Sub On Error Resume Next For Each h In Target If h <> "" Then Application.EnableEvents = False h.Value = Application.WorksheetFunction.VLookup(h.Value, Worksheets("マクロリスト表").Range("A:B"), 2, False) Application.EnableEvents = True End If Next End Sub

関連するQ&A

  • マクロで指定した文字以外にも入力出来るようにしたい

    いつもお世話になります。 今回は以前に教えてもらったマクロで数字をセルに入力しると、マクロ表シートであらかじめ決めている項目の文字に変わるという構文を教えてもらいました。 下記に記します。 Private Sub worksheet_change(ByVal Target As Excel.Range) Dim h As Range Set Target = Application.Intersect(Target, Range("D4:K34, M4:U34, W4:AA34, AC4:AG34")) On Error Resume Next For Each h In Target If h <> "" Then Application.EnableEvents = False h = Application.VLookup(h.Value, Worksheets("マクロリスト表").Range("D:E"), 2, False) Application.EnableEvents = True End If Next End Sub さて、このマクロでは決めた数字以外の文字や数字を入力すると「#N/A」というエラーが返って来ます。 そこで、このセルに文字を入れたり、他の数字を入れられる様にしたり、データの入力規制でドロップダウンリストを付けて他の項目を選んで入力したりしたいのです。 そういう事がもし出来るなら、上記の構文の「どこ」に「どのような」記述を入れたら良いか、ズバリ教えて頂けないでしょうか。 厚かましい、質問ですが、 どうぞ、よろしくお願い致します。

  • マクロ シート削除の記述確認願います

    いつも回答して頂き、感謝しています。 ネットで調べながら、使えそうな記述を少し修正し、シート削除のマクロを記述してみました。 削除するシートの対象は、別のシートに一覧で載せてあります。 ちなみに、シートを挿入する時も、上記で参照する一覧を参照して作ってあります。 こんな場合もあるから、こんな感じに記述した方がいいよって意見がありましたら、教えてください。宜しくお願い致します。 Sub 作業名別のシートを削除する() Dim h As Range On Error Resume Next Application.DisplayAlerts = False With Worksheets("作業名一覧") .Activate For Each h In .Range(.Range("B2"), Range("B65536").End(xlUp)) Worksheets(h.Value).Delete Next End With Application.DisplayAlerts = True End Sub

  • VBA CHANGEイベントに複数イベントを

    いつもお世話になっています。 色々しらべて試してみたんですが、うまくいかないんで教えてください。 CHANGEイベントに複数のイベントを書き込みたいんですが。 今現在、問題なく動いている以下のイベントがあります。 (1) Private Sub Worksheet_Change(ByVal Target As Range) Dim rang3 As Range Dim rang4 As Range Dim ■■ As String Dim LastRow1 As Long LastRow1 = Worksheets("○○").Cells(Rows.Count, "b").End(xlUp).Row Set rang4 = Worksheets("○○").Range("b:I" & LastRow) Set rang3 = Range("h4") If Intersect(Target, rang3) Is Nothing Then Exit Sub On Error Resume Next ■■ = WorksheetFunction.VLookup(Target.Value, rang4, 2, 0) If Err.Number > 0 Then MsgBox Target.Value & "はありません。基本情報台帳に入力してください。" Range("h4").Select Else Application.EnableEvents = False Range("I4").Value = Application.WorksheetFunction.VLookup(Target, Worksheets("△△").Range("b:I"), 2, False) Range("j4").Value = Application.WorksheetFunction.VLookup(Target, Worksheets("△△").Range("b:I"), 3, False) Range("k4").Value = Application.WorksheetFunction.VLookup(Target, Worksheets("△△").Range("b:I"), 7, False) Range("l4").Value = Application.WorksheetFunction.VLookup(Target, Worksheets("△△").Range("b:I"), 8, False) Range("m4").Value = Application.WorksheetFunction.VLookup(Target, Worksheets("△△").Range("b:I"), 5, False) Application.EnableEvents = True Range("K4").Select End If End Sub このシートにもう一つ、イベントを入れたいのですが。 (2) If Target.Count > 1 Then Exit Sub If Intersect(Target, Range("E4")) Is Nothing Then Exit Sub Else If Range("e4").Value = "1" Then Target.Offset(0, 19).Value = "☆" End If どこに入れればいいのかわかりません。 (3) また、(2)のイベントの他に、 (1)のVLOOLUPが実行され、尚且つ(2)のイベントのE4が値が1だった場合、Y4にH4の値を入れたいのですが・・・。 (2)のみなら動くことは確認できましたが、(1)のexit sub の直前に入れたり、end ifの前に入れたりしましたが、片方は動くが、もうひとつが動かないです。 (3)については、まったくわかりません。 マクロについて、自分でネットで勉強した程度なので、基本がわかっていないからなのでしょうが・・・。 どなたか、教えてください。 お願いします。

  • エクセル マクロ 初心者です

    エクセルマクロ初心者です。 以下の2つの Private Sub Worksheet_Change(ByVal Target As Range)を1つのシートで実行させたいのですが、 当方、初心者なので組み合わせ方が分かりません。 よろしくお願いします。 ===No1=== Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False Target = StrConv(Target, vbUpperCase) Application.EnableEvents = True End Sub ===No2=== Private Sub Worksheet_Change(ByVal Target As Range) Dim Ans As Integer If Target.Count = 1 Then Ans = MsgBox("コピーは禁止!!", vbCritical) MsgBox "データを消去します。" With Application .EnableEvents = False .Undo .EnableEvents = True End With End If If Target.Count = 1 Then Exit Sub Else MsgBox “複数セルのコピー禁止!" With Application .EnableEvents = False .Undo .EnableEvents = True End With End If End Sub ------------ 上記の2つを1つのシートで動作させたいのですが、うまくいきません。 単体では、動作します。

  • マクロ・複数シートに適用するには?

    初心者です。以下のマクロを組みました。 これを複数シートに適用するにはどうしたらよいのでしょうか? worksheets selectではうまくいきませんでした>< 具体的には1~80までのシートが数字で分けられており、 「目次」と「新規」以外の全てに適用したいです。 Sub Macro3() Dim sl As String Dim mySht As Worksheet sl = Range("A65536").End(xlUp).Address Range("B1", sl).SpecialCells(xlCellTypeBlanks).EntireRow.Hidden = True For Each mySht In Worksheets Next End Sub

  • 複数のシートにコードを適用したい

    excel vbaについての質問です (vbaについて初心者です) 現在、エクセルで勤務記録表を作成しています。 同じシートが70枚くらいあります。 各シートは同じ構成で、B6からC36までは時刻を打ち込み、 4ケタの数字を打ち込むと時間になるようにしたいと思っています。 例)1234⇒12:34 以下のようなコードを貼り付けているのですが vbaの編集をする「microsoft visual basic」というウインドウのところで、各シートをダブルクリックすると 出てくるウインドウに一つ一つ貼り付けないとうまく動きません ■全てのシートに貼り付けをしなくても動作する方法を教えて いただきたく、お願いします。 コードに誤りがあれば教えていただきたくお願いします。 (標準モジュールや「this workbook」にも貼り付けをしてみたのですが、思うようになりませんでした) 以下 ====================== Private Sub Worksheet_Change(ByVal Target As Range) On Error Resume Next Dim 入力値 As Variant Dim 時 As Long Dim 分 As Long If Intersect(Target, Range("B6:C36")) Is Nothing Then Exit Sub 入力値 = Target.Value '1 If 入力値 = 0 Then 入力値 = terget.Value '2 ElseIf Target.Count <> 1 Then 'And (入力値 <> 0) Then ' メッセージを出す MsgBox "複数セル選択できません", vbCritical With Application .EnableEvents = False .Undo .EnableEvents = True End With '3 ElseIf VarType(入力値) <> vbDouble Then MsgBox "時刻を表す数字を入力してください。" ElseIf 入力値 < 1 Then Exit Sub Else 入力値 = Target.Value 時 = 入力値 \ 100 分 = 入力値 Mod 100 Application.EnableEvents = False Target.Value = TimeSerial(時, 分, 0) Application.EnableEvents = True End If End Sub

  • このマクロあっていますでしょうか?よろしくお願いいたします。

    ★sheetA Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$C$14" And Target.Address <> "$C$19" _ And Target.Address <> "$F$19" Then Exit Sub If Target.Address <> "$R$14" And Target.Address <> "$S$14" _ And Target.Address <> "$T$19" Then Exit Sub Application.EnableEvents = False With Sheets("B") .Range("F14").Value = Range("C14").Value .Range("F17").Value = Range("C19").Value .Range("F20").Value = Range("F14").Value .Range("F23").Value = Range("F19").Value End With With Sheets("C") .Range("F13").Value = Range("R14").Value .Range("F14").Value = Range("S14").Value .Range("F18").Value = Range("T19").Value End With Application.EnableEvents = True End Sub ★sheetB Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$F$14" And Target.Address <> "$F$17" _ And Target.Address <> "$F$23" Then Exit Sub Application.EnableEvents = False With Sheets("A") .Range("C14").Value = Range("F14").Value .Range("C19").Value = Range("F17").Value .Range("F19").Value = Range("F23").Value End With Application.EnableEvents = True End Sub ★sheetC Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$F$13" And Target.Address <> "$F$14" _ And Target.Address <> "$F$18" Then Exit Sub Application.EnableEvents = False With Sheets("A") .Range("R14").Value = Range("F13").Value .Range("S14").Value = Range("F14").Value .Range("T19").Value = Range("F18").Value End With Application.EnableEvents = True End Sub

  • イベントマクロで「コンパイルエラー 因数は省略できません」

    マクロ初心者です イベントマクロを作りました Sheet2の結合されたB44:E44のセルに入力すると自動的にマクロが働いて Sheet1のW1の値のみがSheet2の結合されたB44:E44のセルに貼り付けられるマクロなのですが 実行すると「コンパイルエラー 因数は省略できません」と表示されます マクロ自体は正しく動いているのですがどういうことなんでしょう Sheet2 Worksheet Change Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target.Range("B44:E44")) Is Nothing Then Exit Sub Application.EnableEvents = False Sheets(1).Select Range("W1").Copy Sheets(2).Select Range("B44:E44").Select ActiveSheet.Paste Application.CutCopyMode = False Application.EnableEvents = True End Sub Private Sub Worksheet_Change(ByVal Target As Range)…この行が黄色になります If Intersect(Target.Range("B44:E44")) Is Nothing Then Exit Sub…intersectのところが青くなります こんな説明でわかってもらえるでしょうか?

  • ThisWorkBookモジュールとSheetモジュールの両立

    エクセル2003でマクロを組んでいます。 Sheet1,Sheet2の2つのシートがあり、 片方のシートの"A4:G10"の範囲に値を書き込むと、もう片方の同じ位置に同じ値が書き込まれるようなマクロを組みたいです。 以前ここで教えていただいたものを改変して以下を作りました(ThisWorkBookモジュールです)。 Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Dim r As Range Dim Num As Integer Dim S As String, Sh_name As String Sh_name = ActiveSheet.Name Set r = Intersect(Target, Range("A4:G10")) If Not (r Is Nothing) Then Application.EnableEvents = False For Num = 1 To 2 S = "Sheet" & Num If S <> Sh_name Then Worksheets(S).Range(r.Address).Value = r.Value End If Next Application.EnableEvents = True End If End Sub ここまでは正常に動作します。 また、 Sheet1とSheet2のモジュールに、 A列のセルに値が入力された場合、同じ行のC列のセルの色を塗るという記述をしています。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 1 Then Cells(Target.Row, 3).Interior.ColorIndex = 5 End If End Sub これらを同時に生かしたいのですが、 どのように書けばいいでしょうか。 EnableEvents = False/Trueを消してしまうと、 Worksheets(S).Range(r.Address).Value = r.Valueが実行されるたびにThisWorkBookモジュールが動いているようです。 そして2回目のSet r = Intersect(Target, Range("A4:G10"))でエラーが出ます。 (エラーは出ずとも延々と(無限ではない回数)ThisWorkBookモジュールを繰り返したコードもありました。) よろしくお願いします。

  • マクロを複数のシートに適用する記述を教えて下さい

    またまた、お世話になります。 いつも、丸投げの状態で申し訳ありません。 下記の「ワークシート名を日付を変更することで変えられる記述」を検索して見つけ、引用させて頂きました。 これを、度々変わるワークシート名に対応して、31枚のシート(Sheetno3~33)に適用したいのですが、 「どこに」 「どのような」 記述を加えたら、よろしいでしょうか? どなたか、解る方がおられましたら、是非、ご教授いただけないでしょうか? 毎度、カンニングで答えを見るような質問で恐縮しますが、よろしくお願いいたします。 Private Sub Worksheet_Change(ByVal Target As Excel.Range) On Error GoTo ERR: If Target.Cells(1, 1).Address = "$V$1" Then Me.Name = Target.Cells(1, 1).Text & "日" End If Target.Cells(1, 1).Select Exit Sub ERR: MsgBox "その名前には変更出来ません。", vbCritical + vbOKOnly, "ERROR" Resume Next End Sub

専門家に質問してみよう