
ExcelVBAで質問です。Workbook_openイベントが発生しない。
Excel2003を開いている状態で「ファイル」→「開く」でファイルを開くと
Workbook_openイベントが発生しません。他のマクロは正常に動くのですが、
Excelを閉じている状態でファイルを開くとWorkbook_openイベントが発生します。
(Workbook_Activateイベントでも同様の結果になりました。)
なぜでしょうか?基本的なことかもしれないですが教えていただけると幸いです。
宜しくお願いします。
No.2ベストアンサー
- 回答日時:
『常に』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のコードも確認しましたがありませんでした。
No.8
- 回答日時:
整理すると、
・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の作り直しをおすすめします。
いつも丁寧な回答ありがとうございます。
Application.EnableEvents = False のコードがあり、Trueに戻したらマクロが働きました。
end-uさんの最初の回答の時に、頂いていたのにきちんと確認をしなかった私が悪かったです。
大変申し訳ありませんでした。
今後は、みなさんにご迷惑を掛けるので、もっと勉強してから質問致します。
本当にご迷惑をお掛けしました。又、お知恵を拝借できれば幸いです。今後とも宜しくお願い致します。
No.7
- 回答日時:
#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()イベントは、二重には働かないからです。そんな自明のことを言っているは思えないのです。
大変失礼な返事をしてしまい、申し訳ありませんでした。以後、気をつけます。
Application.EnableEvents = False のコードがあり、Trueに戻したらマクロが働きました。
今後は、みなさんにご迷惑を掛けるので、もっと勉強してから質問致します。
本当にご迷惑をお掛けしました。又、お知恵を拝借できれば幸いです。今後とも宜しくお願い致します。
No.6
- 回答日時:
ありゃ。
済みません、>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は不要です。
捨て置いてください。
毎回ご丁寧にありがとうございます。
end-uさんの解釈の通りです。説明が下手で申し訳ありません。
後、確認したところWorkbook_Openイベントではなく、ThisWorkbookのマクロが走らない様です。
No.5
- 回答日時:
>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
No.4
- 回答日時:
イベント制御の影響ではないみたいですね。
確認したい事が何点かあります。
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
と入れて保存後閉じて、再度開いてみてください。
丁寧な回答ありがとうございます。
早速試して、以下の結果になりました。
>1)起動済みExcelからファイルを開く時はどのように開いてますか?
[ファイル]-[開く]です。又、[ファイル]ダブルクリックでも同様の結果になります。
>2)VBAのコードから該当Bookを開いた場合はどうなりますか?
すいません。VBA始めたばかりの初心者なので開く方法がわからないです。
>3)新規Bookで以下のコードだけの場合でも発生しませんか?
コードを実行して起動済みExcelからMsgBoxが発生しました。
>4)Openイベントが発生しない事はどのように確認しましたか?
コードを実行して起動済みExcelからMsgBoxが発生しませんでした。
No.3
- 回答日時:
> ThisWorkbook自体のマクロが動かない様です。
新しいファイルで試しても動かないのでしたら、一度メニューのヘルプにあるアプリケーションの自動修復を行ったらいかがでしょう。
また、
C:\Program Files\Microsoft Office\OFFICE11\XLSTART
の中になにかしらのエクセルファイルがあれば、どこかに移動してみてから試してみてください。
毎回の回答ありがとうございます。
アプリケーションの自動修復を行ったのですが良い結果は得られませんでした。
又、お知恵をいただければ幸いです。宜しくお願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
VBAでファイルオープン後にコードが実行されない
Visual Basic(VBA)
-
Excel VBAでのWorksheet_Changeが動作しない原因
Excel(エクセル)
-
Workbook_openでマクロが実行されない
Excel(エクセル)
-
-
4
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
5
Openイベントを開始させないでエクセルを開く方法を教えて下さい
Windows 10
-
6
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
7
ユーザーフォームを表示中にシートの操作をさせるには
Excel(エクセル)
-
8
ExcelのVBA。public変数の値が消える
Visual Basic(VBA)
-
9
UserForm1.Showでエラーになります。
工学
-
10
ExcelVBAのユーザーフォームの中に線を引きたい
Visual Basic(VBA)
-
11
VBAのコマンドボタンの文字列の改行方法は?
Visual Basic(VBA)
-
12
VBA シートのボタン名を変更したい
Visual Basic(VBA)
-
13
【Excel VBA】マクロでExcel自体を終了させたい
Excel(エクセル)
-
14
特定セルの内容を更新したら、その更新日を自動的に表示する方法について
Excel(エクセル)
-
15
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
16
Sub Auto_Open() 実行されない
Excel(エクセル)
-
17
エクセルVBAが途中で止まります
Visual Basic(VBA)
-
18
特定のPCだけ動作しないVBAマクロがあります。その理由は?
Visual Basic(VBA)
-
19
エクセルのエラーメッセージ「400」って?
Visual Basic(VBA)
-
20
ListView 項目の選択/選択解除について
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
自治会の通常総会の年度について
-
月の最後の週の呼び名は?
-
総会の年度表記について
-
カレンダーの日付 5/Bの意味に...
-
確認ですが普通5月までに決める...
-
エクセルのフィルターを複数シ...
-
8月までっていつまでのことでし...
-
昔の愛称?「~の字」
-
10月をもって辞めるって、10...
-
「6月まで」というのは6月以内...
-
入社が2月1日とした場合、3ヶ月...
-
何故か毎年3月や4月に不運が続...
-
「なんで付き合おうと思ったか...
-
満何歳の意味
-
足かけ~年の足かけとは?
-
せっかくのクリスマス…。体調崩...
-
「たらばがに?」と聞かれたら...
-
若草山
-
日本の陰暦(旧暦)にあった「1...
-
数字の遊びもよくあるのでしょうか
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
自治会の通常総会の年度について
-
月の最後の週の呼び名は?
-
10月をもって辞めるって、10...
-
カレンダーの日付 5/Bの意味に...
-
ひな祭りに外食するならどこで...
-
確認ですが普通5月までに決める...
-
総会の年度表記について
-
エクセルのフィルターを複数シ...
-
入社が2月1日とした場合、3ヶ月...
-
昔は何歳くらいからお酒を飲ん...
-
「1年以上」の定義について
-
学校の在籍機関
-
「6月まで」というのは6月以内...
-
8月までっていつまでのことでし...
-
昔の愛称?「~の字」
-
月度ってどういう意味ですか
-
定年になる年度を関数で算出したい
-
「なんで付き合おうと思ったか...
-
「今年度」って『今・年度』?...
-
VBA ユーザーフォームのChange...
おすすめ情報