• 締切済み

access イベント名取得方法

accessでフォーム、またはコントロールのイベント名の取得方法を教えてください。 フォーム、コントロール、レポートには、それぞれプロパティシートを持っていて、開くと、 「書式」「データ」「イベント」「その他」「すべて」の4つのタブに分かれています。 やりたいことは、この4つの中で「イベント」タブにある内容をイベント毎に取得したいのです。 <コーディング例> '全フォームループ For Each OBJ In CurrentProject.AllForms 'フォームを開く DoCmd.OpenForm OBJ.NAME, acDesign '****************************************************** '*** ここでフォームのイベントタブの内容を取得したい *** '****************************************************** '全コントロールに対してループ For Each CTL In Forms(OBJ.NAME).Controls '****************************************************** '*** ここでフォームのイベントタブの内容を取得したい *** '****************************************************** Next CTL Next OBJ   <取得結果の例> 1.クリック時:[イベントプロシージャ] 2.更新後処理:aaa() どなたかご教授お願いします。

みんなの回答

  • chie65535
  • ベストアンサー率43% (8508/19344)
回答No.2

以下の方法でイベントを列挙する事ができました。 イベントだけを表示する条件文を消せば「イベント」だけでなく「書式」「データ」「その他」など、すべてのプロパティを表示する事も出来ます。 なお「inCtrl.Properties(i).Valueの値がブランクの物は表示しない」と言う修正を行なえば「イベントが設定されている物」だけを表示出来ます。 因みに、buf変数の中身が長いと表示し切れなくなるので、20個づつ表示しています。 Option Compare Database Public Function get_controls() Dim obj As AccessObject Dim myDB As Object Dim formname As String Dim ctl As Control '自分自身(MDB)を取得する Set myDB = Application.CurrentProject 'すべてのフォームを取得 For Each obj In myDB.AllForms formname = obj.Name 'フォームをデザイナで開く DoCmd.OpenForm formname, acDesign, , , , acHidden 'フォームのプロパティを表示 Call Display_Propatey("(なし)", Forms(formname)) 'フォーム内のコントロールを取得 For Each ctl In Forms(formname).Controls '各コントロールのプロパティを表示 Call Display_Propatey(formname, ctl) Next ctl 'フォームを閉じる DoCmd.Close acForm, formname, acSaveNo Next obj Set myDB = Nothing End Function Private Function Display_Propatey(ByVal ParentFormName As String, ByVal inCtrl As Object) Dim buf As String Dim i As Long Dim j As Long Dim k As Long On Error Resume Next '共通部の取得 buf = "親フォーム=" & ParentFormName & vbCrLf buf = buf & "Name=" & inCtrl.Name & vbCrLf buf = buf & "TypeName=" & TypeName(inCtrl) & vbCrLf 'プロパティの中身を取得 j = 0 k = 0 For i = 0 To inCtrl.Properties.Count - 1 'イベントプロパティ(Categoryが4かつTypeが8の物)だけを表示 If inCtrl.Properties(i).Category = 4 And inCtrl.Properties(i).Type = 8 Then buf = buf & inCtrl.Properties(i).Name & "=" & inCtrl.Properties(i).Value & vbCrLf '20個づつ表示 If (j Mod 20) = 0 Then If k <> 0 Then buf = buf & "(Page = " & k & ")" MsgBox buf buf = "" End If k = k + 1 End If j = j + 1 End If Next '残りがあるなら残りを表示 If buf <> "" Then buf = buf & "(Page = " & k & ")" MsgBox buf End If End Function

  • chie65535
  • ベストアンサー率43% (8508/19344)
回答No.1

「イベントタブの内容(どんなイベントが並んでいるか?)」を列挙する事は出来ません。 イベントは「AfterUpdate」とか「OnClick」とかのイベントプロパティの内容を個別に操作する事は出来ますが、どんなイベントプロパティがあるかを列挙する事は出来ません。

chiroru0705
質問者

お礼

早々のご回答ありがとうございます。 イベントを指定してLOOPするしか方法はないんですね。 コントロールによってイベントも違う為困りました… もう少し、いい案を検討してみます。

関連するQ&A

  • アクセス For Eachの時点 絞る

    For Eachの時点で、コマンドボタンのみに絞ることは可能ですか? Sub Sample() Dim myFormName As String Dim ctl As Control myFormName = "フォーム1" For Each ctl In Forms(myFormName).Controls Debug.Print ctl.Name Next ctl End Sub これでフォーム上の全てのコントロール名を取得できますが ループの時点でコマンドボタンのみを抽出できますか? For Each ctl In Forms(myFormName).Controls If ctl.ControlType = acCommandButton Then Debug.Print ctl.Name End If Next ctl こうすれば、コマンドボタンのみ絞れますが コントロールの数が多すぎて、処理に時間がかかります。 なので For Each ctl In Forms(myFormName).Controls の部分の、ループの時点でコマンドボタンを絞りたいのですが 絞れる方法があれば教えてください。

  • コントロールを削除すると、一つ飛ぶ アクセス

    こんばんは。よろしくお願いします。 フォーム上のイメージを削除してるのですが Sub test() Dim ctl As Control Dim FormName As String FormName = "フォーム2" DoCmd.OpenForm FormName, acDesign For Each ctl In Forms(FormName).Controls If ctl.Name Like "イメージ*" Then Debug.Print ctl.Name DeleteControl FormName, ctl.Name End If Next ctl End Sub これをすると、コントロールが一つ飛ばされます。 イミディエイトウインドウで値を確認すると イメージ0 イメージ2 イメージ4 になりました。 1、3、5が飛ばされました。 実行結果は画像のような感じです。 なぜ飛ばされちゃうのでしょうか? 普段、For Each ctl In Forms(FormName).Controlsを使う分には値が飛ばされる事はないので DeleteControl FormName, ctl.Nameが原因だと思うのですが、 全ての「イメージ」で始まるコントロールを削除したい場合、どうすえばいいですか?

  • For Each  すべてループされない?アクセス

    For Each ctl In Forms(FormName).Controls Debug.Print ctl.Name If ctl.ControlType = acTextBox Then If ctl.Name Like "削除*" Then DeleteControl FormName, ctl.Name End If End If Next ctl こういうループの仕方は、完全型ではないのでしょうか? フォーム上に「削除」で始まるテキストボックスをすべて削除したいのですが 例えば4個あれば、2個のコントロールしか削除されません。 コントロールを削除することにより、インデックスが狂うのでしょうか?

  • VBAでタブのページを削除するには?アクセスです

    フォームにタブコントロールを置いて、ページを6つにして、コマンドボタンを置きました。 3から6ページをVBAで削除する事は可能でしょうか? (1・2は残したいです) 「ページを削除する」というVBAコードがわかりません。 Private Sub コマンド7_Click() Dim ctl As Control For Each ctl In Forms(Me.Name).Controls If ctl.ControlType = acPage Then Debug.Print ctl.Name 'ここでページを削除したい End If Next ctl End Sub あと、もしかしてデザインビューでないと削除できないですか? であれば、DoCmd.OpenForm Me.Name, acDesign を追加しようと思っています。 ご回答よろしくお願いします。

  • 全てのサブフォーム名を取得したい

    オフィス2007です。 Sub test() Dim obj As AccessObject For Each obj In CurrentProject.AllForms Debug.Print obj.Name Next End Sub --------------------------------- 上記のコードでデータベースのすべてのフォーム名は取得できますが フォーム1に乗っかっている複数のサブフォームを取得するにはどうすればいいのでしょうか? サブフォームに独自の名前を付けて、IFステートメントを使うしかないですか?

  • 全てのフォームを削除したい アクセス2010

    フォーム1とフォーム2がありまして、どちらもvbaで削除したいのですが Sub Sample() Dim obj As AccessObject For Each obj In CurrentProject.AllForms Debug.Print obj.Name & "を削除します" DoCmd.DeleteObject acForm, obj.Name Debug.Print obj.Name & "を削除しました" Next End Sub これを実行すると、フォーム2は削除できるのですが、 Nextの部分で、 実行時エラー'-2147467259(80004005)' オートメーションエラーです。エラーを特定できません。 と出て、 デバッグを押して再度実行すると、 実行時エラー92 for ループが初期化されていません にかわります。 デバッグウインドウには フォーム2を削除します フォーム2を削除しました が出力されます。 DoCmd.DeleteObject acForm, obj.Nameをなしにして、コードを実行すると、 フォーム2を削除します フォーム2を削除しました フォーム1を削除します フォーム1を削除しました が出力されます。 フォームを削除することによって順番が狂いエラーが発生するようですが、 そうであれば、どうすればすべてのフォームを削除することができるのでしょうか?

  • コントロールタイプを絞ってループしたい

    アクセスのフォーム上のコントロールをループする際に テキストボックスだけ絞ってループしたいのですが Sub Sample() Dim myFormName As String Dim ctl As Control myFormName = "フォーム1" For Each ctl In Forms(myFormName).Controls If ctl.ControlType = acTextBox Then End If Next ctl End Sub これだとテキストボックスの量が多くて、2秒くらいかかるのですが For Each ctl In Forms(myFormName).Controls この時点で、テキストボックスだけ絞る方法はありますか? For Each ctl In Forms(myFormName).ControlType(acTextBox) こうするとエラーになりました。 ご教授よろしくお願いします。

  • フォーム上のコントロールの名前を配列に格納したい

    アクセスです フォーム上のコントロールの名前を配列に格納したいのですが もっとスマートな方法はありますか? 私が考えたコードは Dim avarContorol As Variant Dim ctl As Control Dim mystr As String For Each ctl In Forms(Me.Name).Controls mystr = mystr & ctl.Name & "," Next ctl '右から1文字消す mystr = Left(mystr, Len(mystr) - 1) avarContorol = Split(mystr, ",") なのですが、 ループのみで格納できる方法があれば教えてください。

  • Access2007 コントロールの削除

    イベント内プログラムで以下のようにフォームのコントロールの削除を行っていますが、 コントロール名が条件に合っていても削除されません。 DeleteControlが失敗しているのではなく、 If Left(ctlSche.Name, 6) = "lblBox" Then にひっかからないようです。 しかも、同じように 頭に"lblBox"とつくラベルコントロールでも、ひっかかるものとそうでないものがあります。 以下のコーディングでは不十分でしょうか? Dim ctlSche As Control DoCmd.Close acForm, FName, acSaveYes DoCmd.OpenForm FName, acDesign, , , , acHidden Set ctlSche = CreateControl(FName, acLabel) For Each ctlSche In Forms!TestForm.Controls If Left(ctlSche.Name, 6) = "lblBox" Then 'コントロールの削除 DeleteControl FName, ctlSche.Name End If Next DoCmd.Close acForm, FName, acSaveYes DoCmd.OpenForm FName, acDesign, , , , acHidden

  • サブフォルダ内のフォルダ名取得

    連続処理のため、特定フォルダ以下のフォルダ名全てを取得する必要があります。 そこで本に書いてあったコードを試してみたのですが、フォルダ以下のサブフォルダまでしか取得できませんでした。 サブフォルダ以下にもフォルダがあるのですが、どのようにして取得すればいいのでしょうか? ↓以下が試してみてコードになります With CreateObject("Scripting.FileSystemObject")  With .getfolder(Start_Path)   For Each Obj_Folder In .subfolders    WorkSheets.Cells(i, 2).Value = Obj_Folder.name    i = i + 1   Next Obj_Folder  End With End With