こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

エクセルマクロ(VBA)初心者です。よろしくお願いします。

(1)エクセルのsheet1のセルA1の値が”0(ゼロ)”でなければ、そのシート上で任意のマクロを実行し、ゼロであれば実行せずにsheet2へとぶ

(2)同じようにsheet2のセルA1がゼロでなければ実効し、ゼロでなければsheet3へとぶ・・・の繰り返し(sheet50まであります。)

このようなマクロ(標準モジュール)の書き方を教えてください。
よろしくお願いいたします。

投稿日時 - 2006-12-11 23:35:43

QNo.2595341

困ってます

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

#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

投稿日時 - 2006-12-12 21:50:00

お礼

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

投稿日時 - 2006-12-13 10:32:49

ANo.4

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.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

投稿日時 - 2006-12-12 11:46:46

補足

補足要求ありがとうございます。
尚、ご指導お願いいたします。

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

投稿日時 - 2006-12-12 19:40:50

ANo.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のところに、コメントをはずし、モジュール・ルーチン名を入れてください。

投稿日時 - 2006-12-12 00:25:46

補足

さっそくのご指導をありがとうございます。
あまりに勉強が不足しているとお叱りをいただきそうですが、重ねてご指導をよろしくお願いいたします。

任意のマクロを「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

でやってみましたが、うまくできませんでした。何か間違いがありますでしょうか?

投稿日時 - 2006-12-12 20:07:51

お礼

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

投稿日時 - 2006-12-12 20:32:19

ANo.1

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

投稿日時 - 2006-12-12 00:11:49

お礼

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

投稿日時 - 2006-12-13 20:18:10

あなたにオススメの質問