- ベストアンサー
エクセル:シート1のセルA1が0でなければ任意のマクロを実行したい
エクセルマクロ(VBA)初心者です。よろしくお願いします。 (1)エクセルのsheet1のセルA1の値が”0(ゼロ)”でなければ、そのシート上で任意のマクロを実行し、ゼロであれば実行せずにsheet2へとぶ (2)同じようにsheet2のセルA1がゼロでなければ実効し、ゼロでなければsheet3へとぶ・・・の繰り返し(sheet50まであります。) このようなマクロ(標準モジュール)の書き方を教えてください。 よろしくお願いいたします。
- みんなの回答 (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
その他の回答 (3)
- zap35
- ベストアンサー率44% (1383/3079)
必要であれば補足をお願いします 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
補足
補足要求ありがとうございます。 尚、ご指導お願いいたします。 (1)A1の値が0以外で「任意のマクロ」を実行した時、次のシートも処理します。(そこで終わりではありません) (2)マクロを実行するときSheet1が必ず選択されているとは限りません。 (3)Sheet1は一番左はじにありません。 (4)「次のシート」はWorksheet(n+1)で良いです。 ★さらに、sheet1~sheet50ではマクロを実行したいのですが、そのほかのシート(いくつかあり、いろいろ名前をつけています)はマクロを実行したくはないのです。 そのような条件で可能でしょうか。よろしくお願いいたします。
- imogasi
- ベストアンサー率27% (4737/17069)
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のところに、コメントをはずし、モジュール・ルーチン名を入れてください。
お礼
お礼欄をつかって恐縮ですが、 (1)A1が空白のときにうまくいかないような気がします。 (2)私の質問の仕方が悪かったのかもしれませんが、 ご指導いただいたコードではアクティブシートでマクロが繰り返されてしまうようです。それぞれのシート上でのマクロ実行がうまくいきませんでした。よろしければ更なるご指導をよろしくお願いいたします。
補足
さっそくのご指導をありがとうございます。 あまりに勉強が不足しているとお叱りをいただきそうですが、重ねてご指導をよろしくお願いいたします。 任意のマクロを「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)
シートのActivateイベントに記述します(Sheet1の場合) ----------------------------------- Private Sub Worksheet_Activate() If Range("A1") <> 0 Then 任意のマクロ Else Sheets("Sheet2").Select 'ここをSheet毎に変える End If End Sub
お礼
ありがとうございました。 標準モジュールでの希望でしたので、ポイントできませんでしたが、 とても参考になりました。感謝いたします。
お礼
ありがとうございました。希望通りの結果がでました。 シンプルなコードですので、勉強させていただくにも理解しやすく感謝です。 心から感謝申し上げます。