[[20090924145137]] 『Application.EnableEvents について』(VBA初心者) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『Application.EnableEvents について』(VBA初心者)

 VBA関係で教えてほしいのですが・・・
 ブックを開いて下記コードを手動で実行してからでないとVBAが機能しないのですが、
 下記コードを手動で実行しないで済むようにはならないでしょうか?
 もしくは自動的に下記コードが実行されるようにはどうすればいいでしょうか?

 Sub test()
    Application.EnableEvents = True
 End Sub


 何処かに Application.EnableEvents = False というコードがあるのでは?
 基本的には、そのコードの最後にApplication.EnableEvents = Trueするように
 してあげるのが解決としては一番ですが・・・

 Thisworkbookモジュールに

   Private Sub Workbook_Open()
   Application.EnableEvents = True
   End Sub

 とすれば、とりあえずは出来ますが不具合の元ですね。
 (momo)

 Application.EnableEvents = False 

 上記コードなのですが・・・
 作成中のbookの中では見あたらないのですが・・・
 なにか見つける手立てありますか?

 (VBA初心者)

 作成中のブックとは限りません。
 エクセルが起動している間に動いた可能性のあるプロシージャ全てが対象です。
 他のブックにあるかもしれませんし、アドインや個人用マクロブックかもしれません。

 その場合、上の対応で逃げたとしてもそのブックでしか対応できず。
 他のブックを開いたときもEnableEventsはFalseのままです。
 根気良く探してみてください。
 (momo)

 そこだけを取り出して質問しても
 意味があるとは思えません。

 ↓で消された部分の質問でしょうから。
[[20090918090713]]『VBA関係』(VBA初心者)

 であれば、問題は別の所に有りそうに思います。

 まぁ、本当に何かがFalseのままで終わっている可能性もあるので
 目的のコードだけを入れたブックだけを開いて
 やってみるのも良いと思います。

 (HANA) 

 なるほど、経緯はわかりました。
 けど、過去に動いたコード。 では無いですね。
 アプリケーションが再起動されればEnableEventsはTrueになるので。

 今動いているアプリケーションが起動してから動いているコードになりますね。
 という所ですと、やはりアドインかマクロブックが可能性が高いですかね。
 (momo)

 momo様・HANA様

 ありがとうございます。
 HANA様のいうように消した部分の質問です。 

 momo様に教えていただいたコードをコピペしましたが機能しないです・・・
 アドイン?マクロブック?何をどう調べて修復したらよいものやら(^^;)
 すいません教えてください。

 (VBA初心者)

 想像では
  ブックを開いた段階で、目的のシートが表示されており
  そのシートを選択する動作を行わないため
  「Private Sub Worksheet_Activate()」
  のコードが走らず、結果
  >ブックを開いて下記コードを手動で実行してからでないとVBAが機能しない
  と感じる状況になっている。

 実際はどうか分かりませんが。

 (HANA)

 それはそのBook内のVBAのコードでコントロールされているとは限らないのですよね?

 もしそうなら、このPCの他bookもVBAも機能しないのですよね?
 なら、VBAが機能してるbookがあればその中に問題のコードがあると見ていいんでしょうか(^^;)
 探すの大変そう〜(^^;)

 (VBA初心者)

 今調べてましたら、該当シートから他のシートを一度ひらいてから戻るとVBAが機能しだすように
 なってるっぽいです。
 なぜだろう?

 (VBA初心者)

 >該当シートから他のシートを一度ひらいてから戻るとVBAが機能しだすように
 >なってるっぽいです。
 
HANAさんが説明している通りで、他の方のスレにも書いたような気がしますが・・・
Worksheet_Activateイベントのマクロの引き金(トリガー)は
「そのシートがActiveでない状態からActiveになること」
つまり、Worksheet_Activateが実行される為には、
あらかじめ別のシートが選択されている状態が前提となります。
(ブックを開いたときにActiveになっている状態ではトリガーにならない)
 
(みやほりん)(-_∂)b

 みやほりん様

 HANAさんの言ってる事はこういう事だったんですね〜(^^;)
 意味解ってなかった・・・なんとなく僕がコード上で変な事をしてるんだと思ってた・・・
 HANAさん申し訳ございませんでしたm(_ _)m

 そっか〜毎回シートを1回変えてからしなきゃならないのか〜・・・
 なんとかシート変えずにする方法って無いですか〜?
 みやほりん様、良案あればお願いします。

 (VBA初心者)

 Workbook_Openイベントマクロで別のシートを一旦選択し、
該当シートを選択する、というマクロを仕込んでおけば、Bookを
開いたときに必ず機能するようになります。
(それで不都合がなければですが)
 
(みやほりん)(-_∂)b

 みやほりん様

 別シートを選択するマクロを仕込むのはmomoさんが教えてくれた

   Private Sub Workbook_Open() 
   Application.EnableEvents = True
   End Sub

 の間に仕込むのですか?
 また、そのコードはどのように記述すればいいですか?

 (VBA初心者)

 考えて作る必要はありません。
別のシートを一旦選択し、目的のシートを選択する、という操作を
マクロ記録することで得られます。
(みやほりん)(-_∂)b


 下記のコードでいいのでしょうか?

 Sheets("sheet2").Select
 Sheets("sheet1").Select
 下記のようにしてもうまくいきません(;;)
   Private Sub Workbook_Open() 
    Sheets("sheet2").Select
      Sheets("sheet1").Select
      Application.EnableEvents = True
   End Sub

 (VBA初心者)

 記録とりました?
 selectで目的のシートが表示されます?
 あえて、答えを出さないので、自動記録をよく見てがんばって下さい。

 話が Worksheet_Activate がトリガーとなって、イベントが動かなくなっている方向に向いていますが、
 そもそも、一番最初は、Worksheet_Activate を使用していないのにMsgが表示されない現象が出ていたと思います。
 確かに、これまでのやり取りの中で Worksheet_Activate が原因の一つである事は明確のようですが、
 別の要因も潜んでいるのではないでしょうか?
 どこかで、EnableEvents を False にしている可能性が十分あるきがしますが…

 (1or8)


 色々固定な部分もあると思うので
 仕様をもう少し書いてみられても良いかもしれません。

 勿論
 >EnableEvents を False にしている可能性
 は確認しておかれるのが良いと思いますので
 この件とは別件として。
 これに関しては、もう少し情報を整理してみられてはどうでしょう。
   私は、全体的に思い違いな気がします。

 (HANA)

 1or8様、HANA様

 ありがとうございます。
 うまくいったんですが、再度教えてください。

 みやほりんさんが教えてくれた下記文を読んで・・・

 「Workbook_Openイベントマクロで別のシートを一旦選択し、
   該当シートを選択する、というマクロを仕込んでおけば、Bookを
   開いたときに必ず機能するようになります。」

  Private Sub Workbook_Open() に直接シート選択のコードを記述するのと僕が勘違いしていました。
  さらに、コードを聞いたところ
 「マクロ記録すれば得られます」と教えて頂いた事を
 「記録する事でコードがわかるよ」と教えてくれたと勘違いしていました(^^;)
  勘違いの合わせ技でPrivate Sub Workbook_Open() にコードをコピペしてました。

  でも、思うように動かなくて1or8さんの「記録とりました?」の1文目でピン!ときて
  もしや、みやほりんさんの「記録を録る」はコードを僕に教えるために録れと言った訳ではなく
  マクロを動かす目的で録れと言われたのだと解りました。
  そこで、みやほりんさんのWorkbook_Openイベントマクロの文を再度読み直して、イベントマクロ
  という言葉にPrivate Sub Workbook_Open() ではマクロを実行させるコードを記述するんだと気付きました。
  そこで実際にマクロにシート変更の記録を録っておいて、Private Sub Workbook_Open() では
  記録したマクロを実行するコードを下記のように記述したら思うようにいきました!
    Private Sub Workbook_Open()   
         Application.Run "Expert Confirmation.xls'!Macro1"
         Application.EnableEvents = True
    End Sub

 HANAさんがおっしゃるとおりEnableEvents を False にしている可能性という課題はあるものの探すのに時間がかかりそうですのでこれは少しずつ原因を探していこうと思います。

 たびたび僕の勘違いで皆様には御迷惑をおかけしましたが根気良く教えていただきありがとうございました。

 本文の最初に「再度教えて下さい」と言ったのは結果的に出来たのですが再認識した事があっているのか?
 また勘違いしてないだろうかと思って不安になったので教えていただきたいと思います。

 当初の認識・・・Private Sub Workbook_Open()に「シートを選ぶ」というコードを記述
 再認識・・・マクロに「シートを選ぶ」という行動を記録
             そしてPrivate Sub Workbook_Open()に「マクロを実行する」というコードを記述      

            (以下の内容が認識があっているのか非常に不安・・・)
             Private Sub Workbook_Open()はbookを開いた時にイベントを発生させるもので
             直接イベントの内容を行動に移してくれるものではないという事。

 (VBA初心者)


 結論を言うと、
   Private Sub Workbook_Open() '(1)
    Sheets("sheet2").Select
      Sheets("sheet1").Select
   End Sub
 
   Private Sub Workbook_Open() '(2)-1
      Application.Run "Expert Confirmation.xls'!Macro1"
   End Sub
   Sub Macro1() '(2)-2 [標準モジュール]
    Sheets("sheet2").Select
      Sheets("sheet1").Select
   End Sub
 
(1) と (2)-1&(2)-2 は動作的には同じです。
 
>Private Sub Workbook_Open()はbookを開いた時にイベントを発生させるもので
>直接イベントの内容を行動に移してくれるものではないという事。
 
「イベント」の認識がおそらく違うと思います。
Private Sub Workbook_Open() 〜 End Sub の間に書かれているのは実行文(ステートメント)
と表現されます。
Workbook_OpenイベントマクロはWorkBookがOpenするという出来事(イベント)を検知したときだけ
Private Sub Workbook_Open() 〜 End Sub の間に書かれたステートメントを実行します。
「シートを選択する」と言うステートメントを直接書いても、
「"シートを選択するプロシージャ"を実行せよ」と言うステートメントを書いても
結果的には同じ動作を期待できるはずです。
(1)(2)で動作が違うとすれば、原因はそのマクロコードではなくて、別のところにあると
思われます。
 
さらに、「マクロ記録することで得られます。」で気が付いていただきたかったのは、
Excelを手で操作して得られる結果はたいていマクロの記録でその実行コードを得ることが出来る、
ということもありますが、教えてもらうよりも、自分で作るほうが身に付く、という
ことでもあります。
 
ちなみに、こちらの検証では、
application.EnableEvents =false の状態のときに、

   Private Sub Workbook_Open() 
   Application.EnableEvents = True
   End Sub
 
上記を記述したブックを開いても、Openイベントが発生しない為、
   Application.EnableEvents = True の状態にはなりませんでした。
 
「マクロがどういうタイミングで実行されるのか」という予備知識がない状態で
イベントマクロを提示されたため、「動かない」という認識に至ったのではない
かと推測しているのですが、いかがでしょうか。
(みやほりん)(-_∂)b

(みやほりん)(-_∂)b


 EnableEvents を False にしている可能性に付いてですが
 私はおおよそVBA初心者さんの思い違いではないかと思っています。

 ですから、本当にFalseに成っているのか居ないのかだけでも
 確認しておかれるのが良いのではないかと思います。

 どのタイミングでどのマクロが何をやっているのか把握して居られないのなら
 これまでにも色々問題が出ていてもおかしくないと思いますので。

 本当にFalseに成っていると結論が出た段階で
 時間をかけて探せばよいと思います。

 今回追加した「Workbook_Open」のコードを削除して保存終了したブックを
 開いて、別シートをアクティブにして再度選択した場合
 希望する動きをするのなら False に成っていないので
 True にする必要は有りません。

 ただ、みやほりんさんも書いて居られる様に
 False に成っていた場合 Open イベントも実行されない様ですので
 Workbook_Open のコードが実行されるという事は
  【EnableEvents は True の状態である】
 と言えると思います。

 つまり、「Workbook_Open」のコード内に有る
 Application.EnableEvents = True
 と言う一文は、意味を持ちません。

 Book1のThisWorkbookモジュール に
    Private Sub Workbook_Open()
        Application.EnableEvents = True
        MsgBox "OPEN"
    End Sub
 のコードを貼り付けて、保存します。

 新しいエクセルを開いて、Book1を開くと
 メッセージボックスが表示されます。

 Book1を一端閉じた後、
    Sub 無効()
        Application.EnableEvents = False
    End Sub
 を実行して、再度 Book1を開いてください。
 メッセージボックスは表示されませんね?

 本当に、
  Application.EnableEvents = True
 の実行が必要なら Workbook_Open に書いたのでは駄目です。
 必要ないなら、Workbook_Open に書いておく必要は有りません。

 >うまくいったんですが
 って事なら 必要ないと思いますよ。

 それに、もしも本当に 何かのマクロが False にしたままで
 終わってしまっているのなら、そのマクロが走った途端に
 目的のコードも動かなくなって仕舞うことに成りますよ?

 >少しずつ原因を探していこうと思います。
 なんて悠長に構えておくのは危険に思います。
 実際の運用までに時間が有るのなら
 少しずつ探して行っても良いのかもしれませんが。。。

 (HANA)

 ちなみに
[[20090917150539]]『VBAコードの記述』(Msg)
 >教育の受けた回数をF144のセルに入力しています。
 >そしてF144に回数を入力する事でE148に習得レベルが1〜10段階上がるように
 >数式が入っています。

 でしたら、Worksheet_Changeイベントを使用して
  F144が変わった時にE148の値を確認
 と言うコードにすれば良いと思います。

 E148にどの様な式が入っているのか分かりませんが
 変化するのが同シート内のセルだけなら
 それらを確認した方が無駄がないんじゃないかと思いますし
 色々な細工も不要に成ると思います。

 場合によっては、やはりCalculateイベントに
 して於いた方が良いのかもしれませんが。
  (その辺りはご説明が無く分かりませんので。)

 それから
[[20090918090713]]『VBA関係』(VBA初心者)
 こちらのお話と切り離してしまった事も
 弊害に成ったと思います。

 まぁ、最初の物は【お名前も違いますし】
 違う方かもしれませんが。

 お名前の話をすると
 私はこれまで
 「イベントが実行されないのは、EnableEvents が False に成っているため
  と言うのは VBA初心者さんの思い違いと思われる」
 と書いていますが、もしもこちらの方と同じ方なら
[[20040323142216]]?『VBAProjectが残ってしまいます』(VBA初心者)
 本当にそう言った状況に成っていたのかも知れないとも思います。
   何年前のログを引っ張ってきてるか!! って気もしますが。(笑)

 新たに質問した方が早くコメントがもらえるかもしれません。
 既に話が進んで居るスレでは、コメントが付くまで時間が掛かるかもしれませんし
  そのままコメントが付かない可能性もたしかに有ると思います。
 似た様な質問を同じ名前で何度もするのは憚られるかもしれません。
 (VBA初心者)と言うニックネームは安心に思えるかもしれません。
 が、
  ニックネームや過去との関連も大切にした方が良いよ
 って事で、所詮小言ですのでこの部分は軽く流して頂ければと思います。 

 (HANA)


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.