• ベストアンサー

ExcelVBAで質問です。Workbook_openイベントが発生し

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

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

  • ベストアンサー
  • end-u
  • ベストアンサー率79% (496/625)
回答No.2

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

lanbee
質問者

お礼

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

lanbee
質問者

補足

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

その他の回答 (7)

  • end-u
  • ベストアンサー率79% (496/625)
回答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の作り直しをおすすめします。

lanbee
質問者

お礼

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

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答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()イベントは、二重には働かないからです。そんな自明のことを言っているは思えないのです。

lanbee
質問者

お礼

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

  • end-u
  • ベストアンサー率79% (496/625)
回答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は不要です。 捨て置いてください。

lanbee
質問者

お礼

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

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答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

lanbee
質問者

お礼

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

  • end-u
  • ベストアンサー率79% (496/625)
回答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   と入れて保存後閉じて、再度開いてみてください。

lanbee
質問者

お礼

丁寧な回答ありがとうございます。 早速試して、以下の結果になりました。 >1)起動済みExcelからファイルを開く時はどのように開いてますか? [ファイル]-[開く]です。又、[ファイル]ダブルクリックでも同様の結果になります。 >2)VBAのコードから該当Bookを開いた場合はどうなりますか? すいません。VBA始めたばかりの初心者なので開く方法がわからないです。 >3)新規Bookで以下のコードだけの場合でも発生しませんか? コードを実行して起動済みExcelからMsgBoxが発生しました。 >4)Openイベントが発生しない事はどのように確認しましたか? コードを実行して起動済みExcelからMsgBoxが発生しませんでした。

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.3

> ThisWorkbook自体のマクロが動かない様です。 新しいファイルで試しても動かないのでしたら、一度メニューのヘルプにあるアプリケーションの自動修復を行ったらいかがでしょう。 また、 C:\Program Files\Microsoft Office\OFFICE11\XLSTART の中になにかしらのエクセルファイルがあれば、どこかに移動してみてから試してみてください。

lanbee
質問者

お礼

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

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.1

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

lanbee
質問者

お礼

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

lanbee
質問者

補足

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

関連するQ&A

  • Auto_OpenとWorkbook_Openの違いは?

    Auto_OpenとWorkbook_Openの違いは何でしょうか? マクロから開かれた場合、Workbook_Openしか実行されないことは認識していますが、それ以外に異なる点は無いのでしょうか? Workbook_OpenやWorkbook_BeforeCloseはブックが最初に開かれたり閉じられたりすると認識していますが、最近このマクロを記述しているブックをウィンドウのバックに置いて、他のブックからこのブックにしようとするとやたら時間がかかるような気がしました。 Workbook_OpenやWorkbook_BeforeCloseを削ったら早くなったような気がしましたが、これは単なる気のせいでしょうか? よろしくお願い申し上げます。

  • ウィンドウのアクティブイベント

    Excel VBAで、ウィンドウがアクティブになった時に呼び出されるイベントプロシジャーを教えて下さい。 Workbook_SheetActivate、Workbook_WindowActivate、Workbook_Activateは検証しました。 Workbook_Activateイベントはブックがオープンされた時のみ呼び出され、それ以外の イベントプロシジャーについては、アクティブになっても全く反応しませんでした。 他のアプリケーションウィンドウとの行き来の際、アクティブになる度に処理を入れたいと 思っています。 よろしくお願い致します。

  • 【Excel】データベースクエリ 開いたらデータの更新後にWorkbook_Openイベントを実行させたい。

    エクセル2003です。 シートに 「外部データの取り込み」→「新しいデータベースクエリ」でアクセスのテーブルを表示させています。 データ範囲プロパティで「ファイルを開く時にデータを更新する」にチェックをいれています。 なおかつWorkbook_Openイベントにセルの書式、加工に関するコードを記載しています。 ファイルを開いた時に、 データの更新→書式設定 をしたいのですが、 Workbook_Openイベント→データの更新 になってしまい、結局書式を加工しても更新されて意味がなくなってしまいます。 「データの更新」より後に発生するイベントはありますか? アドバイス宜しくお願い致します。

  • Excel95のイベントについて

    またまた、Excel95についてなのですが、 ワークブックをアクティブにしたときに発生するイベントは あるのでしょうか? 97以降のものなら Workbook_Activate でできたのですが、 95のやり方がわからなくて…。 それに代わるイベント・方法でも構いませんので、 ご教授願います。

  • ExcelVBAに詳しい方に質問!

    ExcelVBAに詳しい方に質問! 私は仕事でアンケート集計をしている者です。顧客から調査を依頼される のですが、いただくデータはExcel形式のファイルです。なので、 そこからモニターの方向けにWeb化する必要があります。 今回目指しているのは、例えばExcelデータの中でマクロが入った ボタンをたった一回押すだけでHTML形式のWebページに変換 するツールを作りたいと思います。 Excel外のマクロでも良いのですが、ExcelVBAでマクロを組んでWeb 化するには具体的にどのようにVBAを組んだらできますか? また、ExcelVBAでなくExcelファイルをWeb化する違う 方法はありますか? ExcelVBAに詳しい方、是非ご教授の程、よろしくお願いいたします。

  • Office2010のVBAファイル自動オープン

    VBAの自動オープンで対象ファイルの開き方によって VBAが正常に動かないので質問させt下さい。 ネットワーク上のサーバーである AD-1から開くのとネットワークドライブPから開くのとでは Excelの名前の管理機能が動作しません。 Private Sub Workbook_Open() Workbooks.Open Filename:= _ "\\ad1\共通\aaaa.xlsx" Worksheets("Sheet1").Activate と Private Sub Workbook_Open() Workbooks.Open Filename:= _ "P:\共通\aaaa.xlsx" Worksheets("Sheet1").Activate 両方とも稼働させる方法はあるのでしょうか? よろしくお願いします。 End Sub

  • VBAでWorkbook_BeforeSaveイベントで質問

    Workbook_BeforeSaveイベントである条件に達していればExcelファイルを終了したくないのですがどうすればよいでしょうか? WindowsXP ProSP2、Excel2000 コード例) Option Explicit Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) dim flg as boolean if flg=true then exit sub end if End Sub

  • ExcelVBA ファイルオープン時に使用中でないか調べる方法

    [技術者向] コンピューター > プログラミング > その他(プログラミング) でも質問させて頂いたのですが URL:http://oshiete1.goo.ne.jp/qa3166356.html 回答を得ることができず、こちらのカテゴリを勧められた為、再度質問させて頂きます。 ExcelVBAの勉強を始めて間もない者です。 Office2000のExcelでマクロを作成しています。 テキストストリームオブジェクトを作成してファイルを開き、 ファイルの内容をセルに展開するプログラムを書いているのですが、 開こうとしているファイルが他のプロセスで開かれているかどうかを調べる方法はありませんか? Openステートメントを使用すればロックをかけることができるので、 エラーを発生させることができるみたいなのですが、 テキストストリームオブジェクトを使用してファイルを開いている場合に 開くファイルが他のプロセスで使用してるか調べる方法が知りたいです。 説明がわかりにくいとは思いますがよろしくお願いします。

  • 「SceCli」というイベントの発生条件は?

    [イベントビュアー] -> [アプリケーション]の一覧に「SceCli」というイベントが発生していますが、このイベントは何がきっかけで動作するのでしょう? 実はExcelのマクロ実行中にこのイベントが発生すると、マクロが異常終了してしまい困っています。

  • エクセルファイルをオープンしたときの再計算について

    エクセルファイルをオープンすると自動的に再計算がされます。VBAを使って、Workbook_Open()で、再計算を止めると、当然、ブックを開いた時全てで再計算が停止してしまいます。 で、質問ですが、あるブックから他のブックを開いた時には、再計算を行なわない(あるブックにVBAを組み込んで・・(イベントは、ボタンにからめてもok!)にして、手動で他のブックを開いた時は、再計算を行なうようなことが出来るのでしょうか? VBA初心者の僕として、精一杯考えたのは、親となるブックから、他のブックを開いた時に、他のブックのWorkbook_Open()イベントが始る前にWorkbook_Open()を書き込めればできると思うのですが?そんなこと無理なのでは?って思います。どなたか?詳しい方いませんでしょうか?宜しくお願い致します。

専門家に質問してみよう