- ベストアンサー
【Excel】マクロでメッセージを表示する
Excel2003を使用しています。 Aという名前の一覧表を作成するマクロがあります。 マクロAは『Sheet1』を選択した状態で正しく実行されますので、うっかり他のシートを選択した状態で、マクロAを実行してしまうと、一覧表が正しく作成されません。 こうなった場合、誤って作成された一覧表を消去して、もう一度やり直せば済むことなのですが、『Sheet1』を選択していない状態でマクロAを実行しようとすると、何かメッセージ(例えば、“Sheet1を選択後、実行してください”みたいな)が表示されるようにすることはできるでしょうか? 参考書にダイアログボックスにメッセージを表示させるマクロが載っていましたので、マクロAにそのようなコードを追加する(?)ことで可能かな??と思い、質問させていただきました。 よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
マクロの先頭に、 If Not ActiveSheet Is Worksheets("Sheet1") Then MsgBox ("Sheet1を選択後、実行してください") Exit Sub End If というのを追加すれば、できなくはないですが、それよりもマクロの先頭に Worksheets("Sheet1").Select と入れたらいいだけのような気もするのですが。
その他の回答 (3)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。Wendy02です。 >正常に処理されました。 もう、そこまで来れば、もう、ご自身で解決できるとは思いますが、ついでですから。^^; >他のブックがマクロの実行に関係する場合でも、例に挙げていただいたようなマクロは有効なのでしょうか? 実際、ある程度、マクロがこなれて来ると、良く出てくるパターンですね。 ただ、以下のような場合は、恥ずかしながら、たぶん、いけるだろうと思ってコードを書いて、私自身、自分でやってみて、出来たっていうのが正直なところなのです。あまり出てこないパターンなのです。 With Sheets("Sheet1") ↓ With ActiveWorkbook.Sheets("Sheet1") これは、ブックを開けて、そのブックを[アクティブ]にした場合ですね。こういうパターンは、いわゆるアドイン化された時に出てくるものです。 じゃあ、良く出てくるパターンというのは、特定のブックの場合のほうが多いので、以下のようなものになるのです。 Dim Bk As Workbook Set Bk = Workbooks("Test1.xls") With Bk.Sheets("Sheet1") With .Range("C1:C10") .Interior.ColorIndex = xlNone .FormulaR1C1 = "=INT(RAND()*100)" .Value = .Value .Find(WorksheetFunction.Max(.Cells)).Interior.ColorIndex = 34 End With End With Set Bk = Nothing ただし、ひとつだけ条件があって、それは、ブックが開いていることです。そうでなければ、エラーが出ますので、その場合は、エラートラップをつけてあげます。
お礼
こんにちは。 今回も最後まで親切に教えてくださいまして、ありがとうございました。またひとつ覚えて勉強になりました。
- imogasi
- ベストアンサー率27% (4737/17069)
Private Sub Workbook_SheetActivate(ByVal Sh As Object) MsgBox Sh.Name End Sub をThisWorkbookのイベントに入れることで、シートタブの選択を変えるごとにメッセージが出ます。Sh.NameがSheet1であるじかどうかIfで聞く、"Sheet1"のときA表作成ルーチンを実行させる、というのはどうですか。
お礼
回答ありがとうございます。 マクロ勉強中ですが、イベントマクロは使ったことがあります。こういう方法もあるんですね。参考になりました。 教えていただいたコードでも、試してみようと思います。 ありがとうございました。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 確かに、#1 さんのおっしゃるように、Worksheets("Sheet1").Select で事足りますが、もっと基本的なことですが、マクロの実行を、Worksheets("Sheet1") に規定させることですね。 一つは、そのマクロの実行を、ボタンなどをつけて、Sheet1 からのみ実行するようにします。 もう一つは、それぞれの Rangeオブジェクトなどに、Worksheets("Sheet1") などの親オブジェクトを入れてあげることです。 例: 'ランダムの値の中で、最大値に色をつけるマクロ With Sheets("Sheet1") With .Range("C1:C10") .Interior.ColorIndex = xlNone .FormulaR1C1 = "=INT(RAND()*100)" .Value = .Value .Find(WorksheetFunction.Max(.Cells)).Interior.ColorIndex = 34 End With End With このようなマクロの場合は、シートがアクティブでなくても、マクロは働きます。
補足
こんにちは。 いつも基本的なことから丁寧に説明してくださり、ありがとうございます。マクロ勉強中の私にとっては大変参考になります。 早速、例として記載されていたマクロのコードをコピペさせていただき、使ってみました。『Sheet1』以外のシートを選択している状態でマクロを実行してみましたら、正常に処理されました。 今回のマクロAは、複数の他のブックから指定したセルの値を取り出して、一覧表を作成するというものなのですが、他のブックがマクロの実行に関係する場合でも、例に挙げていただいたようなマクロは有効なのでしょうか?
お礼
回答ありがとうございます。 『Sheet1』をアクティブにしていなくてもマクロAを実行すると、マクロが働いて変な一覧表が作成されてしまっていたので、この変な一覧表が作成される前に、『Sheet1』がアクティブになっていないことがメッセージを表示させることでわかれば…とばかり考えていました(^^ゞ マクロAのコードは長いので、シンプルに「Worksheets("Sheet1").Select」を追加するだけにしようと思います。 お手数かけてスミマセンでした。。。