• ベストアンサー

エクセル:シート1のセルA1が0でなければ任意のマクロを実行したい

エクセルマクロ(VBA)初心者です。よろしくお願いします。 (1)エクセルのsheet1のセルA1の値が”0(ゼロ)”でなければ、そのシート上で任意のマクロを実行し、ゼロであれば実行せずにsheet2へとぶ (2)同じようにsheet2のセルA1がゼロでなければ実効し、ゼロでなければsheet3へとぶ・・・の繰り返し(sheet50まであります。) このようなマクロ(標準モジュール)の書き方を教えてください。 よろしくお願いいたします。

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

  • ベストアンサー
  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.4

#03です。補足ありがとうございました。 全てのシートに対して実行するなら#02さんの回答のFor Each文を利用するのが定石と思いますが、先の回答に手を入れたものを再掲します。 変更したのは2点です。 1)Range("A1").Formula で判定するようにした 2)シート名(SheetXX)のXXを取り出して条件判定に加えた Sub Macro1() Dim CntSheet, idx As Integer, RES  CntSheet = Worksheets.Count  idx = 1  Do While idx <= CntSheet   Worksheets(idx).Select   If ActiveSheet.Range("A1").Formula <> 0 Then    RES = Val(Application.Substitute(ActiveSheet.Name, "Sheet", "")) ’シート名からSheetを抜いた結果→RES    If RES > 0 And RES < 51 Then     Call 任意のマクロ名    End If   End If   idx = idx + 1  Loop End Sub

yastaro
質問者

お礼

ありがとうございました。希望通りの結果がでました。 シンプルなコードですので、勉強させていただくにも理解しやすく感謝です。 心から感謝申し上げます。

その他の回答 (3)

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.3

必要であれば補足をお願いします 1)A1の値が0以外で「任意のマクロ」を実行した時、次のシートも処理するのですか(そこで終わりですか?) 2)質問のマクロを実行するときSheet1が必ず選択されているのですか 3)Sheet1は一番左はじにありますか 4)「次のシート」はWorksheet(n+1)で良いですか? それとも見た目通りの順番で「次」ですか?(Sheet番号通りにSheetが並んでいるとは限らないので) 色々と疑問はありますが「Sheet1は一番左端にある。任意のマクロが実行された時点で次のシートは処理しない。次のシートとは見た目の次のシートとする」前提でマクロを書きます Sub Macro1() Dim CntSheet, idx As Integer  CntSheet = Worksheets.Count  Sheets("Sheet1").Activate  For idx = 1 To CntSheet    If ActiveSheet.Range("A1") <> 0 Then      Call 任意のマクロ名      Exit For    Else      If idx < CntSheet Then        ActiveSheet.Next.Select      End If    End If  Next idx End Sub

yastaro
質問者

補足

補足要求ありがとうございます。 尚、ご指導お願いいたします。 (1)A1の値が0以外で「任意のマクロ」を実行した時、次のシートも処理します。(そこで終わりではありません) (2)マクロを実行するときSheet1が必ず選択されているとは限りません。 (3)Sheet1は一番左はじにありません。 (4)「次のシート」はWorksheet(n+1)で良いです。 ★さらに、sheet1~sheet50ではマクロを実行したいのですが、そのほかのシート(いくつかあり、いろいろ名前をつけています)はマクロを実行したくはないのです。 そのような条件で可能でしょうか。よろしくお願いいたします。

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

Sub test06() Dim sh As Worksheet For Each sh In Worksheets If sh.Range("A1") <> 0 Then MsgBox sh.Name 'AAA Else End If Next End Sub ーーー 初心者には突飛かも知れないが、常套手段です。 In ActiveWorkBookでなくIn Worksheetsです。 AAAのところに、コメントをはずし、モジュール・ルーチン名を入れてください。

yastaro
質問者

お礼

お礼欄をつかって恐縮ですが、 (1)A1が空白のときにうまくいかないような気がします。 (2)私の質問の仕方が悪かったのかもしれませんが、  ご指導いただいたコードではアクティブシートでマクロが繰り返されてしまうようです。それぞれのシート上でのマクロ実行がうまくいきませんでした。よろしければ更なるご指導をよろしくお願いいたします。

yastaro
質問者

補足

さっそくのご指導をありがとうございます。 あまりに勉強が不足しているとお叱りをいただきそうですが、重ねてご指導をよろしくお願いいたします。 任意のマクロを「Macro1」とするとき、 Sub test06() Dim sh As Worksheet For Each sh In Worksheets If sh.Range("A1") <> 0 Then MsgBox sh.Name Macro1 Else End If Next End Sub でやってみましたが、うまくできませんでした。何か間違いがありますでしょうか?

  • ASIMOV
  • ベストアンサー率41% (982/2351)
回答No.1

シートのActivateイベントに記述します(Sheet1の場合) ----------------------------------- Private Sub Worksheet_Activate()  If Range("A1") <> 0 Then   任意のマクロ  Else   Sheets("Sheet2").Select 'ここをSheet毎に変える  End If End Sub

yastaro
質問者

お礼

ありがとうございました。 標準モジュールでの希望でしたので、ポイントできませんでしたが、 とても参考になりました。感謝いたします。

関連するQ&A