
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も見ています
-
プロが教える店舗&オフィスのセキュリティ対策術
中・小規模の店舗やオフィスのセキュリティセキュリティ対策について、プロにどう対策すべきか 何を注意すべきかを教えていただきました!
-
Workbook_openでマクロが実行されない
Excel(エクセル)
-
Sub Auto_Open() 実行されない
Excel(エクセル)
-
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
-
4
VBAでファイルオープン後にコードが実行されない
Visual Basic(VBA)
-
5
Excel VBAでのWorksheet_Changeが動作しない原因
Excel(エクセル)
-
6
Openイベントを開始させないでエクセルを開く方法を教えて下さい
Windows 10
-
7
エクセルのエラーメッセージ「400」って?
Visual Basic(VBA)
-
8
DATE型変数を初期化する方法
Visual Basic(VBA)
-
9
Application.ScreenUpdating = Falseが効きません
Visual Basic(VBA)
-
10
EXCELでワークシートを開いたらマクロを自動実行したい
Excel(エクセル)
-
11
WorkBooksをオープンさせずにシートにコピーしたい【EXCEL VBA】
Excel(エクセル)
-
12
VBAでループ内で使う変数名を可変にできないか。
Visual Basic(VBA)
-
13
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
14
VBAコード記述に際して、コード全体を自動的にインデント付ける方法
Access(アクセス)
-
15
VBAで、なぜかSendkeyが効きません。
PowerPoint(パワーポイント)
-
16
ExcelのVBA。public変数の値が消える
Visual Basic(VBA)
-
17
エクセルVBAが途中で止まります
Visual Basic(VBA)
-
18
VBAでブックを非表示で開いて処理して閉じる方法
Excel(エクセル)
-
19
EXCEL VBA マクロ 実行する度に処理速度がどんどん遅くなる原因が知りたい
Excel(エクセル)
-
20
worksheetFunctionクラスのVlookupプロパティを取得できません エラーへの対応
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
10月をもって辞めるって、10...
-
エクセルのフィルターを複数シ...
-
月の最後の週の呼び名は?
-
8月までっていつまでのことでし...
-
満何歳の意味
-
カレンダーの日付 5/Bの意味に...
-
『無線LANが切れる時、何かイベ...
-
入社が2月1日とした場合、3ヶ月...
-
ExcelVBAで質問です。Workbook_...
-
定年になる年度を関数で算出したい
-
本願寺教如書状
-
「陽気」という言葉の使い方
-
昔の愛称?「~の字」
-
一ヶ月前、一ヶ月後
-
12:00 PM は何時?
-
○年後の3月末日を関数で出したい
-
BETWEEN を2つ以上使用する方...
-
彼氏がクリスマスバイトをいれ...
-
自治会の通常総会の年度について
-
キリストが死んだのは西暦何年...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
満何歳の意味
-
月の最後の週の呼び名は?
-
エクセルのフィルターを複数シ...
-
10月をもって辞めるって、10...
-
カレンダーの日付 5/Bの意味に...
-
「陽気」という言葉の使い方
-
8月までっていつまでのことでし...
-
入社が2月1日とした場合、3ヶ月...
-
『無線LANが切れる時、何かイベ...
-
一ヶ月前、一ヶ月後
-
「1年以上」の定義について
-
VBAで先月、先々月を求める方法
-
「6月まで」というのは6月以内...
-
昔の愛称?「~の字」
-
キリストが死んだのは西暦何年...
-
○月第○週 の数え方について
-
ExcelVBAで質問です。Workbook_...
-
○年後の3月末日を関数で出したい
-
彼氏がクリスマスバイトをいれ...
-
BETWEEN を2つ以上使用する方...
おすすめ情報