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

解決済みの質問

【Excel】マクロでメッセージを表示する

Excel2003を使用しています。

Aという名前の一覧表を作成するマクロがあります。
マクロAは『Sheet1』を選択した状態で正しく実行されますので、うっかり他のシートを選択した状態で、マクロAを実行してしまうと、一覧表が正しく作成されません。

こうなった場合、誤って作成された一覧表を消去して、もう一度やり直せば済むことなのですが、『Sheet1』を選択していない状態でマクロAを実行しようとすると、何かメッセージ(例えば、“Sheet1を選択後、実行してください”みたいな)が表示されるようにすることはできるでしょうか?

参考書にダイアログボックスにメッセージを表示させるマクロが載っていましたので、マクロAにそのようなコードを追加する(?)ことで可能かな??と思い、質問させていただきました。
よろしくお願いします。

投稿日時 - 2006-11-21 17:15:54

QNo.2553542

暇なときに回答ください

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

マクロの先頭に、

  If Not ActiveSheet Is Worksheets("Sheet1") Then
    MsgBox ("Sheet1を選択後、実行してください")
    Exit Sub
  End If

というのを追加すれば、できなくはないですが、それよりもマクロの先頭に
Worksheets("Sheet1").Select
と入れたらいいだけのような気もするのですが。

投稿日時 - 2006-11-21 17:30:26

お礼

回答ありがとうございます。

『Sheet1』をアクティブにしていなくてもマクロAを実行すると、マクロが働いて変な一覧表が作成されてしまっていたので、この変な一覧表が作成される前に、『Sheet1』がアクティブになっていないことがメッセージを表示させることでわかれば…とばかり考えていました(^^ゞ

マクロAのコードは長いので、シンプルに「Worksheets("Sheet1").Select」を追加するだけにしようと思います。
お手数かけてスミマセンでした。。。

投稿日時 - 2006-11-22 11:59:57

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

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

回答(4)

ANo.4

こんばんは。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

ただし、ひとつだけ条件があって、それは、ブックが開いていることです。そうでなければ、エラーが出ますので、その場合は、エラートラップをつけてあげます。

投稿日時 - 2006-11-22 20:31:39

お礼

こんにちは。

今回も最後まで親切に教えてくださいまして、ありがとうございました。またひとつ覚えて勉強になりました。

投稿日時 - 2006-11-24 16:36:34

ANo.3

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
MsgBox Sh.Name
End Sub
をThisWorkbookのイベントに入れることで、シートタブの選択を変えるごとにメッセージが出ます。Sh.NameがSheet1であるじかどうかIfで聞く、"Sheet1"のときA表作成ルーチンを実行させる、というのはどうですか。

投稿日時 - 2006-11-21 22:57:02

お礼

回答ありがとうございます。

マクロ勉強中ですが、イベントマクロは使ったことがあります。こういう方法もあるんですね。参考になりました。

教えていただいたコードでも、試してみようと思います。
ありがとうございました。

投稿日時 - 2006-11-22 13:54:16

ANo.2

こんばんは。

確かに、#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

このようなマクロの場合は、シートがアクティブでなくても、マクロは働きます。

投稿日時 - 2006-11-21 19:09:54

補足

こんにちは。

いつも基本的なことから丁寧に説明してくださり、ありがとうございます。マクロ勉強中の私にとっては大変参考になります。

早速、例として記載されていたマクロのコードをコピペさせていただき、使ってみました。『Sheet1』以外のシートを選択している状態でマクロを実行してみましたら、正常に処理されました。

今回のマクロAは、複数の他のブックから指定したセルの値を取り出して、一覧表を作成するというものなのですが、他のブックがマクロの実行に関係する場合でも、例に挙げていただいたようなマクロは有効なのでしょうか?

投稿日時 - 2006-11-22 13:48:37

あなたにオススメの質問