_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ _/ _/ ソフト名:イベント発生順序の検証ツール (Ver1.00) _/ 種 別:フリーソフト _/ 開発環境:Windows98SE & Excel2000SR1(9.0.3822) _/ 動作環境:上記環境にて動作確認してあります。 _/      2000からの新機能は使っていないのでExcel97でも _/      動作すると思いますが環境が無い為、確認していません。 _/      (Excel95では動作しません) _/ 著作権者:角田 桂一 < addinbox@h4.dion.ne.jp > _/           < http://addinbox.sakura.ne.jp/index.htm > _/           < 旧サイト:http://www.h3.dion.ne.jp/~sakatsu/index.htm > _/ 免 責 :このマクロを使用したことで発生したいかなる損害に _/      ついても、作者は一切責任を負わないものとします。 _/ 再配布 :内容を改変しないという条件で、再配布は自由です。 _/ 転 載 :無断転載はご遠慮願います。 _/ 履 歴 :2000/8/20 Ver1.00 _/ その他 :McAfee VirusScan(4.0.3a)にてウィルスチェックしてあります。 _/      ウィルスデータファイル『4.0.4139 2001/5/20受信』 _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ UserForm1‥‥‥オプションボタンのクリック/True,Falseの代入時のイベント発生 UserForm2‥‥‥テキストボックスとフレームに拘わるイベント発生順序の確認(下記参照) UserForm3‥‥‥VBAヘルプのEnter/Exitで紹介されている使用例 --------------- イベント発生順序確認ツールについて -------------------- 注意:EXCEL2000(SR-1未対応)では、カーソルが行方不明になるなどの障害が出ます。    後述の「サポート技術情報」に関する説明を参照。 (1) フォーム上の表示に関する説明   ・赤字のコントロールはTabStop=False      VBEで各コントロールの[TabStop]を変更すれば反映されます。   ・カッコ内の数字はTabIndex値(緑はUserForm2,青はFrame1内)      VBEで各コントロールの[TabIndex]を変更すれば反映されます。   ・アクティブコントロールは黄色で表示されます。   ・フレーム内に取り残されたアクティブコントロールは薄赤で表示されます。      本来、フォーカスがフレーム内コントロールから、フレーム外へ移動すれば、      [Frame1.ActiveControl]は【対象コントロールが無い】という状態のはず      ですが、何故か【有効コントロールあり】の状態になっています([Frame1]      自体は、この時点でフォーカスは持っていません)。 (2) イベントは発生した順に、『検証』シートへ書き出されます。    凡例:KeyDown(KeyCode[Shift]) 'Valueプロパティ'       KeyPress(AsciiCode)   'Valueプロパティ'       Enter         例) TextBox1 Enter           TextBox2 Enter    (注) "1"〜"8"が入力されている状態でリターンキーを押すと、[Change]イベントが       2回連続して発生します。→(7)その他 参照 (3) 実行手順   ・VBEでUserForm2を呼び出し、実行ボタンを押す("Focusなし"の動作になります)。   ・EXCEL画面上に配置したボタンを押して実行する。     SetFocusなし ‥‥ UserForm2.Show     Frame1   ‥‥‥ UserForm2.Frame1.SetFocus 後に UserForm2.Show     TextBox   ‥‥‥ InputBoxでフォーカスを移すTextBox番号を入力します。   UserForm2.TextBox?.SetFocus 後に UserForm2.Show   ・終了時は「閉じるボタン」または「CommandButton2(Unload)」を押します。 (4) プロパティの変更   TextBox/Frame1のタブオーダーやTabStopプロパティを変えて色々と試して下さい。 (5) SetFocusメソッド実行の検証   [F1〜F8]または["1"〜"8"Enter]でTextBox1〜8 へ SetFocus(KeyDownイベント)します。   ただし、["1"〜"8"Enter]が自コントロールを指す場合は、BeforeUpdateでのCancel処理   による対応となります(7:その他参照)。   フォーカス移動の前にMsgBox表示を行う事ができます(チェックボックスで切替)。     (Excel2000(未SR1)ではMsgBox表示後にカーソルが行方不明になるバグがあります)     〔入力エラーでMsgBox表示後にフォーカスを自コントロールに留める(Cancel処理)〕という   パターンに相当する処理の再現     MsgBox表示汲ノして、自コントロールのBox番号を入力後してリターンキーを押す (6) Wait機能   イベントの発生状況を詳しく検証できるように、各イベントごとにWait(1秒)させることが   できます。ただし、下記の点に注意してください。  【Waitを掛けた場合の注意事項】 ・通常のキー操作では、KeyDownのWaitを抜ける前にキーが持ち上がってしまい、KeyPress    /KeyUpイベント発生に繋がらない場合があります(Click/MouseUpも同様)。   ・CmdBtn/CheckBoxがクリックを認識しない場合がありますが、もう一度クリックすると正    しく認識します。   ・[Shift+Tab]では最後までShiftを押し続けてください。 (7) その他   Enter押下時にBeforeUpdateを必ず発生させる為、空白の追加&削除を行っています(Changeが   2回発生します)。   イベントごとに"Repaint"しているのでフォームがチラツキます。   フォーカス項目の検出は、イベントごとに、     [ActiveControl.Name 及び Frame1.ActiveControl.Name]   で検出しています(イベント名表示直前)。   『自動保存』を解除する、もしくは”確認ウィンドウを表示しない”にして下さい。    自動保存ウィンドウ表示後にカーソルが戻りません。 ================================================================================= 【フォーカス/イベントに関するバグ情報】 (1) フレーム内からフレーム外へフォーカスを移した場合、元のコントロール(フレーム内)の   Exitイベントが発生しない。   正確には、次回フレーム内にフォーカスが移る(またはフォームを閉じる)時まで、発生が   待たされる。   TextBox3(Frame1) => TextBox1 => TextBox2(Frame1)の例    Box3_Enter -> Frame1_Exit -> Box1_Enter -> Frame1_Enter -> Box3_Exit -> Box2_Enter (2) フレーム内からフレーム外へフォーカスを移した場合、フレームレベルのフォーカスが消滅   しない(フレーム外へフォーカスが移っても"Frame1.ActiveControl"が有効である。フォーム上   でピンク表示になっているコントロールです)。      この事象が(1)のバグの原因になっていると思われる(フレーム内の閉じた空間では、フォーカス   が移動したと認識していない)。 (3) フレーム外からフレーム内(タブオーダー先頭以外)のコントロールへマウスクリックで   フォーカスを移すと、フレーム内【タブオーダー先頭】コントロールのEnter/Exitが   連続して発生する。   TextBox1 => TextBox4(Frame1)の例    Box1_Exit -> Frame1_Enter -> Box2_Enter -> Box2_Exit -> Box4_Enter   原因について:     フレーム外からフレーム内へのフォーカス移動を指示された時に、フォーカスを     与えるコントロールの選択手順が       If ( [Shift+Tab]による ) Then         フレーム内タブオーダー最後のコントロールにフォーカスを与える       Else         フレーム内タブオーダー先頭のコントロールにフォーカスを与える       End If     となっているのではないか(CLICK操作に対する動作が抜けていて、結果的に     CLICKも"Else処理"に回る)。これだと、クリックしたコントロールの前に、     タブオーダー先頭コントロールのイベントが発生するのも理解できる。 (4) フレーム内【タブオーダー最後】コントロールにおいて、リターンキー押下時のBefore_Update   イベントで"Cancel"すると以下の症状になる。   ・フォームレベルのフォーカスはフレームの次のコントロールに移るが、そのコントロールに    カーソルは来ない。   ・フレームレベルのフォーカスは【タブオーダー最後】コントロールのままで、カーソルは    このコントロールにある。   ・この状態で[Shift+Tab]すると、フォームレベルのフォーカスがフレームに無いのに、フレーム    内のコントロールを順に遡って行く。もちろん、キー入力も受け付ける。 (5) TextBox2〜5のTabStopを全てFalse(フレーム内コントロールなしの状態にする)にすると、   UserForm3(VBAヘルプのEnter/Exitで紹介されている使用例)と同じになります。Waitを   掛けた状態でTab移動を繰り返すと面白い現象が見られます。 ================================================================================= 【サポート技術情報 [OFF2000]ユーザーフォーム上のコントロールにフォーカスが移動しない】 http://www.microsoft.com/JAPAN/support/kb/articles/JP237/8/63.asp http://support.microsoft.com/default.aspx?scid=kb;ja;237863 (補) EXCEL2000 ‥‥‥ Build=2812 EXCEL2000SR-1 ‥ Build=3822 1.フレーム内のコントロールにフォーカスが移動しない    『フレーム内にコントロールを配置すると、フォーカスがどのコントロールにもない 状態でユーザーフォームが表示される。』 正確には【フレームをユーザーフォームのタブオーダー先頭にした】場合の現象。 (EXCEL2000での検証結果)   ユーザーフォーム表示直後の状態は、 ・UseForm1.ActiveControl → Frame1を指している(正常)。 ・Frame1.ActiveControl → Frame1内タブオーダー先頭のコントロールを   指している(正常)。 ・カーソルがどこにもない。 ・文字キーを押しても、どのコントロールにも表示されない。 ・リターンキー/タブキーを押すと正しくタブオーダー2番のコントロール  に移動してカーソルも表示される。 (EXCEL2000SR-1での検証結果)‥‥修正された   カーソルが正しく「Frame1内タブオーダー先頭のコントロール」に現れる。 (確認方法)   VBEでUserForm2のタブオーダーを変更(Frame1を先頭にする)し、 ・VBEの"実行ボタン" ・標準モジュール(NoFocus)   で確認できます。 2.ユーザーフォーム表示前にSetFocusメソッドで指定したコントロールにフォーカスが   移動しない    『Showメソッドを使用してユーザーフォームを表示する前に、SetFocusメソッドを 使用してコントロールにフォーカスを移動することができません。』 (EXCEL2000での検証結果)   ユーザーフォーム表示直後の状態は、    ・UseForm1.ActiveControl → フレーム外を指定‥‥指定のコントロールを指している (正常)  フレーム内を指定‥‥Frame1を指している  Frame1を指定  ‥‥Frame1を指している    ・Frame1.ActiveControl → フレーム外を指定‥‥UnKnown (正常)  フレーム内を指定‥‥指定のコントロールを指している  Frame1を指定  ‥‥Frame1内タブオーダー先頭のコン    トロールを指している ・カーソルがどこにもない。 ・文字キーを押しても、どのコントロールにも表示されない。 ・リターンキー/タブキーを押すと正しく次のタブオーダーのコントロール  に移動してカーソルも表示される。 (EXCEL2000SR-1での検証結果)‥‥修正された   カーソルが正しく「指定のコントロール」に現れる。 (確認方法)   標準モジュール(FocusTextBox1〜FocusTextBox8,FocusFrame1)を実行して確認できます。 3.メッセージボックス表示後にSetFocusメソッドで指定したコントロールにフォーカスが移動しない    『メッセージボックス表示後にSetFocusメソッドで、現在フォーカスがあるコントロールに フォーカスを移動することができません。』 正確には   『MsgBox(UserFormも同様)表示後に、表示前フォーカスがあったコントロールへ    カーソルが戻らない(ActiveControlは正しくそのコントロールを指している)』 という障害である。 これにより、   ・CommandButtonのクリックで、MsgBox(UserFormも同様)表示後に、フォーカスは留    まっているがカーソルが戻らず(消えた)、スペースキーを押してもクリック動作に    繋がらない。   ・TextBoxでリターンキー押下時にBeforeUpdate/ExitイベントでMsgBox(UserFormも    同様)表示後に"Cancel"した場合、フォーカスは留まっているがカーソルが戻らず    (消えた)、そのままキー入力してもTextBoxに値が取り込まれない。 という現象が起こる。 (EXCEL2000での検証結果)   上記現象の通り。 (EXCEL2000SR-1での検証結果)‥‥修正された   カーソルが正しく戻ってくる。 (確認方法)   各TextBoxで、F1〜F8を押すか、"1"〜"8"&リターンでフォーカス移動を行う。この   際「MsgBoxの表示有無」を切り替えて結果に違いがないかを確認できる。 ----(補足)----------------------------------------------------------------------------              。。。。。。。。。。。。。。。。。    『SetFocusメソッドで現在フォーカスがあるコントロールにフォーカスを移動できない』と いう事象は全く別の障害であり、MsgBoxの表示に関係なく発生している。 "自分自身へのSetFocus"は【現在既にフォーカスを持っているのだから改めて自身へ SetFocusする必要はない】と解釈されて無視されている結果と思われる。 実際のプログラムでは、リターンキー押下時のKeyDown/Exitなどで行っているのだから、 SetFocusが無視された結果としてリターンキーの効果が働き、【正しく】次のコントロー ルへフォーカス移動することになる。 これが「自分自身へSetFocusしているのに次のコントロールへ移動してしまう」と映る。 この障害(?)はEXCEL2000SR-1でも修正されていない。 尚、「他のコントロールへのSetFocus」の場合は、【リターンキーによる"次"タブオー ダーのコントロールへの移動】の方がSkipされる(正しい)為、『移動先コントロールの その次』へまで移ることはない。