- ベストアンサー
ACCESS VBA 判定に利用できる情報について
- ACCESS VBAの判定に利用できる情報について
- 上位ルーチンからコールされたか判定する方法はあるか
- サブルーチンの処理を切り替えたい場合のアドバイス
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
追加です。 No4の(2)のところで、 これは、(1)でもたとえばテキストボックスに クリック時のイベントは設定していてもダブルクリック時の イベントを設定していなければイベントは とらえることはできないのと同じです。 とかいていますが、これはある意味正確ではないので、 スルーしてください。実際には両方登録するとクリック のみが検出されます。 なお、クリックイベントについては以下にあり、 http://msdn.microsoft.com/en-us/library/aa211343%28v=office.11%29.aspx Remarksの終わりあたりに、ダブルクリックの イベント順序が載っています。 >また、上位モジュール名を取得できるようなオブジェクトはないもの >でしょうか この部分は少し分かりづらいのですが、 (「上位モジュール名」の意味が?です) >if(Me.CurrentEvent = vbClick) then のようなことはAccessではできません。まず Accessではイベントのトレースができないのです。 イベントはクリックした後、他のイベントに 引きわたされたら、たとえば、クリックのあと、 Me!テキスト1 = "Hellow" としたら、これが今のイベントになってしまいます。 したがって、「Me.CurrentEvent」というような ものはNo4の(1)のような場合に限って推定が できる、と考えたほうがいいと思いますが。 海外のサイトでも似たような質問を あちこちのサイトで見かけますが、だいたいの 答えは、 「Accessではイベントのトレースができない」 というのが多いような気がします。
その他の回答 (4)
- piroin654
- ベストアンサー率75% (692/917)
どのようなことがしたいのか分かりませんが、 直接イベントを捉えることはできないので 以下のような感じですが。 (1) 単純に考えれば、アクティブになっている コントロールを取得する。 以下は簡易な内容です。 標準モジュールに以下を貼り付けます。 Sub cmdCtl(ct As Object) Dim ctl As Control Dim strControl As String Set ctl = Screen.ActiveControl strControl = ctl.Name 'プロパティにクリック時のイベントが設定されているか If ct(strControl).OnClick <> "" Then MsgBox "クリックされました" 'プロパティにダブルクリック時のイベントが設定されているか ElseIf ct(strControl).OnDblClick <> "" Then MsgBox "ダブルクリックされました" End If End Sub コントロールのクリック時、ダブルクリック時の イベントに、 Private Sub コマンド0_Click() '最初に記述 Call cmdCtl(Me) 'その他のイベントの記述 End Sub しかし、これはNo1での回答とあまり大差は ないような気もしますが。 (2) たとえば、フォームにボタン、テキストボックス などに何のイベントも設定せずに、それぞれの コントロールをクリック、あるいはダブルクリック したときのイベントを捉えることはできません。 これは、(1)でもたとえばテキストボックスに クリック時のイベントは設定していてもダブルクリック時の イベントを設定していなければイベントは とらえることはできないのと同じです。 このような場合、APIでウィンドウ上のマウスの 位置をとりだし、またクリックかあるいはダブルクリック なのかもAPIでクリックする間隔でそれを検出 することが必要になります。 したがって、(1)やNo1以外の方法となると Accessの範囲を越えた事をする必要が でてきます。
- piroin654
- ベストアンサー率75% (692/917)
No1、No2です。 No1の Dim hantei as Integer は、標準モジュールに変数を設定 する場合は、 Public hantei としてください。
お礼
アドバイス有難うございます。Public変数で実現することもひとつの 方法であることも理解できました。 今ひとつお力をお借りしたいのですが。。。VBAの機能の中で、現在 動作している状況(ClickイベントなのかDclickイベントなのか) また、上位モジュール名を取得できるようなオブジェクトはないもの でしょうか。。。なにかありそうでWEBで探しているのですが、中々 見つからなくて↓ 例えば。。。 if(Me.CurrentEvent = vbClick) then といったような仕組みがあれば理想的なのですが。。。 よろしくお願いします
- piroin654
- ベストアンサー率75% (692/917)
No1です。 Call chgcolor(Me.txt1) hantei = 1 は、 hantei = 1 Call chgcolor(Me.txt1) ############### Call chgcolor(Me.txt1) hantei = 0 は、 hantei = 0 Call chgcolor(Me.txt1) のように、先にhanteiに値を 設定したほうがいいのかもしれません。 試していないので、確認してみてください。
- piroin654
- ベストアンサー率75% (692/917)
引数を増やさないということであれば、 たとえば、標準モジュールに Dim hantei as Integer として、 Private Sub txt1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) Call chgcolor(Me.txt1) hantei = 1 End Sub Private Sub txt1_DblClick(Cancel As Integer) Call chgcolor(Me.txt1) hantei = 0 End Sub Sub chgcolor(a As Control) If hantei = 1 Then →a.BackColor = CLng("&HFF00FF") Else →a.BackColor = CLng("&HFFFFFF") End Sub というような方法はどうですか。
お礼
ご丁寧な回答ありがとうございました。 アドバイスを参考にいろいろ試してみましたが、残念ながらできませんでした。 しかし、「Accessではイベントのトレースができない」という性質を身にしみ ることができたことは、非常に収穫だったと思います。 大変遅くなりましたが、今回の質問で結局やってみたかったことは、ACCESS を利用してオブジェクト指向的なプログラミングの練習をしてみたかっただけ です。 なかなか、難しいものですね。これからもがんばります。