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

解決済みの質問

シート単体の時のみマクロを有効に。

メニュー画面となる「menu.xls」ファイルと、コードごとの管理の為の「コード.xls」ファイルがあります。
「menu.xls」はシート「メニュー」・「リスト」・「フォーマット」の構成で、この「フォーマット」シートにコードの名前をつけて保存したものが、「コード.xls」となっています。

「フォーマット」シートにはいくつかのVBAを施してあるんですが、これを
「menu.xls」として開くときには実行させず(無効化)、「コード.xls」として開くときには実行(有効化)させたいのです。

現在、「コード.xls」としてシート「フォーマット」を開いた時はマクロがWorkbook_Openで動作してくれて構わないのですが、「menu.xls」として開いた時もシート「フォーマット」のWorkbook_Openが動作してしまい、エラーが出てきてしまいます。

「フォーマット」シートに実行判定を付ければいいのでしょうか?
どうしたらいいか全くわかりませんので、ご教授頂きたくお願い申し上げます。

投稿日時 - 2012-04-23 16:53:36

QNo.7437208

困ってます

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

Workbook_Openの先頭でブック名を判定して、menu.xlsなら実行しないようにすればいいのでは。

If ThisWorkbook.Name = "menu.xls" Then Exit Sub

投稿日時 - 2012-04-23 17:15:09

補足

ご回答ありがとうございます。
無事に、menu.xlsとして開いたときはマクロが自動実行されなくなりました。

ですが、今知ったことなのですが、Wookbook_OpenはThis Workbookのプロジェクト?に記述しないと動作しないということなのでしょうか。
「コード.xls」で開いた時動作しませんでした。

「menu.xls」内のマクロで、「フォーマット」シートをコピーして「コードの名前をつけて保存」としています。
この時「フォーマット」シートのVBAは「コード.xls」でもコピーされているんですが、
「menu.xls」のThis Workbookのwookbook_openはコピーされず、「コード.xls」でwookbook_openで動作してほしいマクロが動いてくれません。

どうしたらいいのでしょうか、全くわかりません。

投稿日時 - 2012-04-24 11:03:59

お礼

解決致しました。

Workbook_OpenではなくWorksheet_Activateとして「フォーマット」シートに記述し、
教えて頂いた
If ThisWorkbook.Name = "menu.xls" Then Exit Sub End If
を入れて判定させました。

これで無事動作致しました。ありがとうございます。

ベストアンサーは、悩んだのですが早くに回答を下さったnag0720さんにします。
ありがとうございました。

投稿日時 - 2012-04-24 11:21:12

ANo.1

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

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

回答(2)

ANo.2

アイデア次第でどうとでも出来そうに見えます。


例:「メニューブック」なら実行しない
private sub Workbook_Open()
 if thisworkbook.name = "menu.xls" then exit sub
’do original task
end sub


例:シート数を見て実行しない
private sub Workbook_Open()
 if thisworkbook.worksheets.count > 1 then exit sub
’do original task
end sub


例:ブック名を検証して実行しない.たとえばA1セルに「コード」が記入されている
private sub workbook_Open()
 if thisworkbook.name <> thisworkbook.worksheets(1).range("A1").value & ".xls" then exit sub
’do original task
end sub




#補足
何を「実行させない」ようにしたいのかも説明不足です。
・他にあるマクロも,直接実行指示しても実行不可にしたいなら
  個々のマクロに上述同様の仕込みをしておくことも出来ます
  workbook_Openで「フラグ」をどこかに用意して,個々のマクロにチェックさせてもいいです

・なにかイベントプロシジャを阻止したいなら
 application.enableevents = false
 をworkbook_openで宣言してしまっても良いかもしれません。
 もちろん個々のイベントプロシジャの中で,前述と同じくしてもいいです。

投稿日時 - 2012-04-23 17:31:56

お礼

keithinさんは以前にもご回答してくださいましたね、度々本当にありがとうございます。

今回はWookbook_Openを使うこと自体が間違っていたようです。
Wooksheet_Activateを使ったら上手くいきました。

>>何を「実行させない」ようにしたいのかも説明不足です。
今回は、「menu.xls」の「メニュー」シート・「リスト」シート・「フォーマット」シートのうち「フォーマット」シートのみマクロを無効化したい。
けど「コード.xls」の「フォーマット」シートのみで開くときは実行させたい。
という質問をさせて頂きました。申し訳御座いません。

例もたくさん挙げて頂き、本当にありがとうございます。
「シート数を見て」や「ブック名を検証して」などの条件文は、他にも使えそうです。
是非参考にさせて頂きたいと思います。
何度もご教授頂き、本当にありがとうございます。

投稿日時 - 2012-04-24 11:36:53

あなたにオススメの質問