「これはヤバかったな」という遅刻エピソード

ExcelVBAで質問です。Workbook_openイベントが発生しない。
Excel2003を開いている状態で「ファイル」→「開く」でファイルを開くと
Workbook_openイベントが発生しません。他のマクロは正常に動くのですが、
Excelを閉じている状態でファイルを開くとWorkbook_openイベントが発生します。
(Workbook_Activateイベントでも同様の結果になりました。)
なぜでしょうか?基本的なことかもしれないですが教えていただけると幸いです。
宜しくお願いします。

A 回答 (8件)

『常に』Workbook_openイベントが発生しないのですか?


試しに
Sub test()
  MsgBox Application.EnableEvents
End Sub
こんなマクロを実行してみてください。
イミディエイトウィンドウに
?Application.EnableEvents
と入力してEnter、でも良いです。
これでApplicationのイベント制御状態が判ります。
Falseの場合、イベントを発生させない設定になっています。
他Bookのコードで
Application.EnableEvents = False
と記述している箇所はないですか?

この回答への補足

ありがとうございます。
Workbook_openイベント(ThisWorkbook自体)は常に発生しないのではなくExcelを起動している
状態でファイルを開いた時だけ発生しない様です。ファイルからExcelを起動した場合は発生します。
頂いたコードを早速試してみたのですが「True」と帰ってきます。
他Bookのコードも確認しましたがありませんでした。

補足日時:2010/09/28 13:32
    • good
    • 1
この回答へのお礼

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

お礼日時:2010/09/29 11:23

整理すると、



・ThisWorkbookにイベントコードが書かれたBook、【test.xls】がある。
・起動済みExcelから[ファイル]-[開く]で【test.xls】を開いても、
 Workbook_OpenやWorkbook_Activateイベントが機能しない。

という問題。

確認済み事項としては
1)Excelが起動してない状態で【test.xls】を開くと
 Workbook_OpenやWorkbook_Activateイベントが実行される。
2)EnableEventsプロパティでのイベント制御ではない。
3)この問題が発生してるのは【test.xls】のみで、
 新規BookのWorkbook_Openイベントは問題なく実行される。
4)アプリケーションの自動修復を行っても解消されない。
...といったところですね。

安直な回答になるかもしれませんが、Bookの破損を疑ったほうが良いと思われます。
Bookを作成し直す事は可能でしょうか?

新規Bookに旧Bookのデータのみを移します。シートやモジュールのコピーではなく。
1)新規Book作成し、必要なシート数を追加する。
2)各シートごとに、旧シートのデータ範囲をコピーし、
 新規Bookシートに貼り付ける。
3)他シートを参照している数式などがあれば[編集]-[リンクの設定]で
 リンク元を修正する。
 また、名前の定義を設定していたりする場合は再設定する。
4)各シートにVBAコードが書かれているなら、
 そのコードを新規Bookのシートモジュールにコピーペーストする。
5)標準モジュールがあれば必要数を挿入し、コードのみコピーペーストする。
6)ThisWorkbookモジュールのコードのみをコピーペーストする。
 できれば、念のためThisWorkbookモジュールのコードウィンドウの上部、
 (General)(Declarations)のドロップダウンリストからプロシージャを選択し、
 コードの中身だけ移す。

以上のような手順になります。状況が許せばBookの作り直しをおすすめします。
    • good
    • 1
この回答へのお礼

いつも丁寧な回答ありがとうございます。
Application.EnableEvents = False のコードがあり、Trueに戻したらマクロが働きました。
end-uさんの最初の回答の時に、頂いていたのにきちんと確認をしなかった私が悪かったです。
大変申し訳ありませんでした。
今後は、みなさんにご迷惑を掛けるので、もっと勉強してから質問致します。
本当にご迷惑をお掛けしました。又、お知恵を拝借できれば幸いです。今後とも宜しくお願い致します。

お礼日時:2010/09/29 15:14

#5の回答者です。



他人に代弁してもらって、その人の発言が合っているなんて言い方では返事になっていないと思います。解決しているなら、私は何も言いません。私は、誰が解決しようと構わないです。しかし、そうでないなら、もうちょっと、手がかりになる内容を分かりやすく、丁寧に書いてほしいですね。解決したいなら、手を抜かないでください。

>使用している「book」は1種類のみです。
一種類?種類と言われたら分からないですね。通常は、何個使っても、CSVやxlsmが混在していなければ、種類は一種類のはずです。

ファイルはひとつってことで、その中で、スコープとしては、ThisWorkbook モジュール内で動いたり働かなかったりということですか?もし、そうなら、コードを見なければ話にならないと思います。

それとも、Excelを起動して、空の状態(Book1など)で、次に既存のファイルを開いて、Workbook_Openイベントが動かないというのか、それとも、別の既存のブック(マクロ搭載)を開いて、もうひとつの既存のファイル(マクロ搭載)で、そのWorkbook_Openのイベントが働かないということですか。

現象例:
エクプローラから、Excelファイル(xls)を選択して起動しファイルを開くなら、Workbook_Openイベントは働くというのは分かっています。しかし、その次です。

(1)
Excel起動 空のブックが出てくる(Book1) そこで、ファイル--[開く]--> myBook1.xls(マクロ搭載-Workbook_Open) 
ここで、Workbook_Openのイベントが働かない

もしくは、

(2)
Excel起動 空のブックが出てくる(Book1) そこで、ファイル--[開く]--> myBook1.xls(マクロ搭載)--myBook1.xlsを操作をする --[開く]-->myBook2.xls(Workbook_Openイベント搭載)
ここで、Workbook_Openのイベントが働かない

一体、どういうことなのでしょうか?

>Workbook_openイベントが発生しません。他のマクロは正常に動くのですが、
ふつうは、コードを見てもらうのが一番早いです。それで、そのコードに問題ないか判定できます。

しかし、人にコードを見せるのが嫌だったら、Workbook_Open()、その次の行あたりに、Stop ステートメントを入れておいて、一旦保存して、ファイルを開く操作をすればよいです。Stopで、VBEditor が開き、ステップモードに替えれば、イベントが走っていることが分かるはずです。そうでなければ、イベントは働いていないということですから、その前のファイルの段階で問題が発生しているということになります。

VBAは、単にイベントが働いていないという現象だけで、問題の箇所をピタリ当てられるほど、単純だとは思っていません。

解決方法の具体例

例1:
Private Sub Workbook_Open()
Stop '←ここに入れる(イベントが働いていれば、ここで止まります)
変数の宣言




もうひとつは、他のイベントやコードで、
Application.EnableEvents = False
'実行
Application.EnableEvents = True '←この戻すのを忘れているとか、False のままで終わっているということですね。

検索で、「Application.EnableEvents」をプロジェクト内で調べればよいです。
False 側が抜けていれば、それを直せばよいです。

でも、この話だけでは、まだ抜けがあります。つまり、それは、(一種類でなく!)ファイルがひとつだとしたら、そんなことはありえないです。当たり前のことですが、開けた時だけですから、Workbook_Open()イベントは、二重には働かないからです。そんな自明のことを言っているは思えないのです。
    • good
    • 1
この回答へのお礼

大変失礼な返事をしてしまい、申し訳ありませんでした。以後、気をつけます。

Application.EnableEvents = False のコードがあり、Trueに戻したらマクロが働きました。
今後は、みなさんにご迷惑を掛けるので、もっと勉強してから質問致します。
本当にご迷惑をお掛けしました。又、お知恵を拝借できれば幸いです。今後とも宜しくお願い致します。

お礼日時:2010/09/29 15:08

ありゃ。

済みません、
>1)起動済みExcelからファイルを開く時はどのように開いてますか?
>  [ファイル]-[開く]からでしょうか。
この確認は不要でした。無かった事にしてください。

>Excel2003を開いている状態で「ファイル」→「開く」でファイルを開くと
>Workbook_openイベントが発生しません。
と、最初の質問文に明記してありましたね。失礼しました。



それと、Workbook_Openイベントは、それが書かれているBook自身がOpenする時に走るイベントです。
他BookのOpenは感知しません。

Workbook_Openイベントが書かれたBookが【test.xls】というBookだとします。
・Excelが起動してない状態で、その【test.xls】を(例えば)ダブルクリックで開くとOpenイベントが走る。
・先にExcelを起動して、[ファイル]-[開く]から【test.xls】を開くとOpenイベントが走らない。
と、いうふうに質問文を解釈していました。

ですが、Wendy02さんがおっしゃるように
・【test.xls】自体を開くとOpenイベントが走る。
・先に【test.xls】を開いておいて、【他のBook】を開いた時にはOpenイベントが走らない。
という現象についての質問でしたら私のカン違いですから回答番号:No.4は不要です。
捨て置いてください。
    • good
    • 0
この回答へのお礼

毎回ご丁寧にありがとうございます。
end-uさんの解釈の通りです。説明が下手で申し訳ありません。
後、確認したところWorkbook_Openイベントではなく、ThisWorkbookのマクロが走らない様です。

お礼日時:2010/09/29 11:22

>Workbook_openイベント(ThisWorkbook自体)は常に発生しないのではなくExcelを起動している


>状態でファイルを開いた時だけ発生しない様です。ファイルからExcelを起動した場合は発生しま>す。

それは、イベントの種類が違っているからだと思います。以下のようにすればできるはずです。別に、Workbook_Openは関係がないのですが、最初に、xlAppオブジェクトを作らないといけないからから、使っています。xlApp_WorkbookOpenイベントという違うイベントです。

最初に、Workbook_Open()を実行しないと、次のブックには感知しません。なお、新規ブック(NewBook)に関しては、イベントが違います。

'//ThisWorkbook モジュール
Private WithEvents xlApp As Application 'モジュールの上部に書く
Private Sub Workbook_Open()
  Set xlApp = Application
End Sub

Private Sub xlApp_WorkbookOpen(ByVal Wb As Workbook)
  MsgBox Wb.Name
End Sub
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
使用している「book」は1種類のみです。
回答No.6のend-uさんの解釈の通りです。

お礼日時:2010/09/29 10:03

イベント制御の影響ではないみたいですね。


確認したい事が何点かあります。

1)起動済みExcelからファイルを開く時はどのように開いてますか?
  [ファイル]-[開く]からでしょうか。

2)VBAのコードから該当Bookを開いた場合はどうなりますか?
  Workbooks.Open Filename:="C:\test\Book1.xls"
  ..など。 "C:\test\Book1.xls"は該当Bookのフルパス。

3)新規Bookで以下のコードだけの場合でも発生しませんか?
  Private Sub Workbook_Open()
    MsgBox ThisWorkbook.Name
  End Sub

4)Openイベントが発生しない事はどのように確認しましたか?
  該当BookのWorkbook_Openイベントの冒頭に
  MsgBox ThisWorkbook.Name
  あるいは
  Stop
  と入れて保存後閉じて、再度開いてみてください。
    • good
    • 0
この回答へのお礼

丁寧な回答ありがとうございます。
早速試して、以下の結果になりました。

>1)起動済みExcelからファイルを開く時はどのように開いてますか?
[ファイル]-[開く]です。又、[ファイル]ダブルクリックでも同様の結果になります。

>2)VBAのコードから該当Bookを開いた場合はどうなりますか?
すいません。VBA始めたばかりの初心者なので開く方法がわからないです。

>3)新規Bookで以下のコードだけの場合でも発生しませんか?
コードを実行して起動済みExcelからMsgBoxが発生しました。

>4)Openイベントが発生しない事はどのように確認しましたか?
コードを実行して起動済みExcelからMsgBoxが発生しませんでした。

お礼日時:2010/09/29 11:12

> ThisWorkbook自体のマクロが動かない様です。



新しいファイルで試しても動かないのでしたら、一度メニューのヘルプにあるアプリケーションの自動修復を行ったらいかがでしょう。

また、
C:\Program Files\Microsoft Office\OFFICE11\XLSTART
の中になにかしらのエクセルファイルがあれば、どこかに移動してみてから試してみてください。
    • good
    • 0
この回答へのお礼

毎回の回答ありがとうございます。
アプリケーションの自動修復を行ったのですが良い結果は得られませんでした。
又、お知恵をいただければ幸いです。宜しくお願い致します。

お礼日時:2010/09/29 11:31

Sheet1とかのマクロではなくThisWorkbookのマクロでWorkbook_openを作成したでしょうか?

この回答への補足

「ThisWorkbook」のマクロで作成しました。
今、確認したのですがWorkbook_openイベントが発生しないのではなく、ThisWorkbook自体のマクロが
動かない様です。

補足日時:2010/09/28 13:09
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/09/29 11:24

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A