ACCESS VBA 判定に利用できる情報について

このQ&Aのポイント
  • ACCESS VBAの判定に利用できる情報について
  • 上位ルーチンからコールされたか判定する方法はあるか
  • サブルーチンの処理を切り替えたい場合のアドバイス
回答を見る
  • ベストアンサー

ACCESS VBA 判定に利用できる情報について

下のようなテストプログラムを作ってみました。 サブルーチン chgcolorの中で、どちらの上位ルーチンからコールされたか で処理を切り替えたいと考えています。上位ルーチンからの引数を増やす ことなく、判定する方法はないものでしょうか。  アドバイスお願いします。 Private Sub txt1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) Call chgcolor(Me.txt1) End Sub  : Private Sub txt1_DblClick(Cancel As Integer) Call chgcolor(Me.txt1) End Sub  : Sub chgcolor(a As Control) ◇txt1_MouseDownからコールされた場合(またはクリックイベントの場合) →a.BackColor = CLng("&HFF00FF") ◇txt1_DblClickからコールされた場合(またはダブルクリックイベントの場合) →a.BackColor = CLng("&HFFFFFF") End Sub

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

  • ベストアンサー
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.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ではイベントのトレースができない」 というのが多いような気がします。

katchine
質問者

お礼

ご丁寧な回答ありがとうございました。 アドバイスを参考にいろいろ試してみましたが、残念ながらできませんでした。 しかし、「Accessではイベントのトレースができない」という性質を身にしみ ることができたことは、非常に収穫だったと思います。 大変遅くなりましたが、今回の質問で結局やってみたかったことは、ACCESS を利用してオブジェクト指向的なプログラミングの練習をしてみたかっただけ です。 なかなか、難しいものですね。これからもがんばります。

その他の回答 (4)

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.4

どのようなことがしたいのか分かりませんが、 直接イベントを捉えることはできないので 以下のような感じですが。 (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)
回答No.3

No1、No2です。 No1の Dim hantei as Integer は、標準モジュールに変数を設定 する場合は、 Public hantei としてください。

katchine
質問者

お礼

アドバイス有難うございます。Public変数で実現することもひとつの 方法であることも理解できました。 今ひとつお力をお借りしたいのですが。。。VBAの機能の中で、現在 動作している状況(ClickイベントなのかDclickイベントなのか) また、上位モジュール名を取得できるようなオブジェクトはないもの でしょうか。。。なにかありそうでWEBで探しているのですが、中々 見つからなくて↓ 例えば。。。  if(Me.CurrentEvent = vbClick) then といったような仕組みがあれば理想的なのですが。。。 よろしくお願いします

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.2

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)
回答No.1

引数を増やさないということであれば、 たとえば、標準モジュールに 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 というような方法はどうですか。

関連するQ&A

  • Access VBAによるフォームの色変更。

    個人での捜索に行き詰ってしまいましたので、ご相談させていただきます。 ○使用環境 WindowsXP Access2007 VBAで色変更する、Accessのフォームについて質問させていただきます。 下記の記述で「フォーム名」というフォームをボタンで開こうとしています。 Private Sub コマンド2_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)   DoCmd.OpenForm Form_フォーム名.Name   Form_フォーム名.Section(0).BackColor = "12349952" End Sub Private Sub コマンド3_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)   DoCmd.OpenForm Form_フォーム名.Name   Form_フォーム名.Section(0).BackColor = "1643706" End Sub その際、ボタンによって背景色を変更して表示しようとしています。 デザインビューで「フォーム名」のプロパティを変更した直後はボタンの操作で背景色が変わりますが、 一度、「フォーム名」をクローズして、再度ボタンの操作でオープン するときには反映されなくなっています。 もしかしたら、自身の方で何か見落としがあるかもしれませんが、同様の事象をご存知の方がおられましたら、ご指南いただきたいです。 宜しくお願い致します。

  • 同じコマンドボタンからマウスカーソルがはなれたら

    フォーム上のコマンドボタンにマウスカーソルが触れたら色を付ける、 同じコマンドボタンからマウスカーソルがはなれたら 、また色を変える、 という動きをvbaで行いたいのですが、 Private Sub cmd_test_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) Me.cmd_test.BackColor = RGB(255, 180, 200) End Sub で、マウスカーソルが触れたら色を付けることはできたのですが、 マウスカーソルがそのコマンドボタンから離れたら色を変えるという動きができません。 Private Sub cmd_test_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) Me.cmd_test.BackColor = RGB(255, 255, 255) End Sub Private Sub cmd_test_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) Me.cmd_test.BackColor = RGB(255, 255, 255) End Sub Private Sub cmd_test_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) Me.cmd_test.BackColor = RGB(255, 255, 255) End Sub をしても、マウスカーソルが離れても色が白になりませんでした。

  • エクセル2010のvbaについて

    押されたコマンドボタンの名前を取得したいです (調べてみましたがエラーになり取得できませんでした) 後コマンドボタンがたくさんあり、コードも長く とても邪魔なので省略したいのですができますか? (左クリックと右クリックで違う処理をした後       MouseDown コマンドボタンの名前で少し処理を変えるコードです) MouseUp (下のコードのような感じです) 回答お願いします Private Sub CommandButton1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal y As Single) Select Case Button Case 1 Range("A1") = 1 Case 2 Range("A1") = 2 End Select End Sub Private Sub CommandButton1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal y As Single) If (コマンドボタンの名前を取得) = "aaa" Then Range("A1") = Range("A1") + 1 Else Range("A1") = Range("A1") - 1 End If End Sub

  • VB6 ドラッグ&ドロップ

    Image1をPicture1(正方形)にドラッグ&ドロップするプログラム を作りたいと思っています。 このプログラムだとImage1全体がドラッグされるのではなく、 Image1の絵はその位置に残ってImage1の外枠だけがドラッグされてしまいます。 外枠だけでなくImage1の絵も一緒にドラッグできるようにするにはどうすればいいのでしょうか? また、このプログラムだとドロップする場所(Picture1_)以外で ドロップしてしまった場合でも画面上からImage1の絵と外枠が消えてしまいます。 ドロップする場所(Picture1_)以外でドロップしてしまった場合は、 Image1全体を画面上に残しておきたいのですがどうすればいいのでしょうか? Option Explicit Dim dx As Single, dy As Single Private Sub Form_Load() Image1.Picture = LoadPicture(App.Path & "picture.jpg") Image1.Stretch = True End Sub Private Sub Form_DragDrop(Source As Control, X As Single, Y As Single) Source.Move X - dx, Y - dy End Sub Private Sub Image1_MouseDown(Button As Integer, Shift As Integer, _ X As Single, Y As Single) Image1.Drag 1 dx = X: dy = Y 'マウスダウン位置 End Sub Private Sub Picture1_DragDrop(Source As Control, X As Single, Y As Single) Source.Visible = False 'ドロップオブジェクトを非表示にする Picture1.BackColor = RGB(255, 255, 255) End Sub Private Sub Picture1_DragOver(Source As Control, X As Single, Y As Single, _ State As Integer) If State = 0 Then Picture1.BackColor = RGB(0, 0, 255) If State = 1 Then Picture1.BackColor = RGB(255, 255, 255) End Sub

  • Accessレポートで1行おきに色を変える

    Private Sub 詳細_Print(Cancel As Integer, PrintCount As Integer) FontCount = FontCount + 1 If FontCount Mod 2 = 1 Then Me.Section(0).BackColor = 16777215 Else Me.Section(0).BackColor = 16777164 End If End Sub としてみました。 ですが何らかわりなく… 試しに Private Sub 詳細_Print(Cancel As Integer, PrintCount As Integer) FontCount = FontCount + 1 If FontCount Mod 2 = 1 Then Me.Section(0).BackColor = 16777215 Else Me.Section(0).BackColor = 16777164 End If MsgBox FontCount End Sub としてみたところずーっと「1」が表示され、変数がかわってないようです。 いったいどこがダメなのでしょうか? 確か以前できたはずなのに…(><)

  • リストのダブルクリックイベントをフォーム起動時に発

    アクセス2010です。 Private Sub Form_Load() Call lst_test_DblClick End Sub Private Sub lst_test_DblClick(Cancel As Integer) MsgBox "" End Sub このような事は出来ないのでしょうか? リストのダブルクリックイベントをフォーム起動時に発動したいのですが このコードを書くと Call lst_test_DblClick の部分で引数を省略できません。 になります。 どちらもフォームモジュールに書いています。

  • 実行時のコントロール移動について

    実行時にデザイン時と同じようにコントロール移動をおこないたいのですが、コードを忘れてしまいました。もしご存知の方ご教授お願いします。下記にしめしたものが少しだけ覚えているものです。したがってうまく起動できていません。よろしくお願いしたいます。VB6です。w2k Private Sub cmd_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) x1 = X y1 = Y End Sub Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = 1 Then cmd.Left = (X - x1) + x1 cmd.Top = (Y - y1) + y1 End If End Sub

  • OLEDragDropで フォームとSSTABの違いがわからない。

    VisualBasicを使っています。 OLEDragDropを使おうとしていますが、フォームの方は正しく動作しましたが、 SSTABの方はファイルをドロップさせても無反応でした。 使い方を間違えているのでしょうか? Private Sub Form_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single) Call PicConvert(Data) End Sub Private Sub SSTab1_OLEDragDrop(Data As TabDlg.DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single) Call PicConvert(Data) End Sub

  • アクセス レポート バックカラーの変更方法

    現在レポートで1行ごとにバックカラーを変えて印刷しておりますが、それをチェックボックスにチェックがはいった行だけをカラーにするよう変更したいと考えておりますが、よくわかりません。現在のコードをコピーしました。お手数ですがご指導願います。 Option Compare Database Dim bline As Integer Private Sub Report_Open(Cancel As Integer) End Sub Private Sub ページヘッダー_Format(Cancel As Integer, FormatCount As Integer) bline = 0 End Sub Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer) bline = bline + 1 If bline Mod 2 Then Me.Section(0).BackColor = 16777215 Else Me.Section(0).BackColor = 12663225 End If End Sub

  • エクセル2010のコマンドボタンついて

    MouseDownイベントでループ(Doなど)をさせた後 MouseUpイベントでStopさせるコードを作りましたが MouseUpイベントまで行かずずっとループしてしまいます (押されている間はボタンが凹んでいますが このコードにすると凹まず中断しないと 動かせないようになってしまいます) 何が原因がわからないので回答お願いします 下はコードです Private Sub CommandButton1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal y As Single) Select Case Button Case 1 Range("A1") = 1 Case 2 Range("A1") = 3 End Select Do Range("A1") = Range("A1") + Range("A1") Loop End Sub Private Sub CommandButton1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal y As Single) Stop End Sub (Select Case Button Case 1...にしても変わりませんでした)

専門家に質問してみよう