重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

Access VBAについて質問です。
現在業務で利用している小さなプログラムですが、勉強しつつ開発しています。

多くのフォームがあり、
それぞれのフォームでForm_Open時イベントで、標準モジュール記載の「Form_Init」処理を共通して実行しています。(Form_Initではフォームの全画面表示や、テキストボックスやラベル等のコントトロールに対して共通処理を実行。)

これを、クラスモジュールを利用できないかと思い質問させていただきます。
【仮で作成したCls_cmnFormクラスモジュール】
Public Sub Form_Init(Byval ThisForm as Object)

'''<フォーム以外の時は処理を抜ける>
If Not ThisForm.Name Like ("Frm_*") Then
Exit Sub
End If

'''<フォームの共通処理>
With ThisForm
.RecordsetType = 4
.ScrollBars = 0
.Modal = false
.Menubar = ""
~~ 中略 ~~
End With

End Sub

【仮で作成したFrm_ClassTestフォームオブジェクト】

Private ThisForm as New Cls_Form

Private Sub Form_Open(Cancel as Integer)
'''<フォームの初期化処理>
ThisForm.Form_Init(Me)

End Sub

これでフォームを開こうとすると「実行時エラー:438 オブジェクトは、このプロパティまたはメソッドをサポートしていません。」と表示されます。
なんとなく<フォームの共通処理>で設定しているプロパティの値がおかしいのかと思いますが、対処方法が見つかりません。
フォーム自体を引数にしてプロシージャを実行すること自体がおかしいのでしょうか?
解決方法がわかる方いましたらご教授ください。

A 回答 (1件)

'Private ThisForm As New Cls_Form


'↓
Private ThisForm As New Cls_cmnForm
で、エラーにはなりませんでしたが...

~~ 中略 ~~
に問題があるのでは...

ステップ実行で、どこでエラーになるか調べてください。
    • good
    • 0
この回答へのお礼

cmnが抜けていましたね。。。
ただ、クラス名を正しく入力してもエラーを吐いてしまいました。

解決方法として、
クラスモジュールのメンバ変数に
「Private ThisForm As Object」を定義し、
Form_Init処理時に、
引数のフォームオブジェクトをメンバ変数にセットし、
そのメンバ変数に対して共通処理を走らせることで、
解決することができました。

自己解決となり申し訳ないです。ありがとうございます。

【解決したCls_cmnFormクラスモジュール】
'''<メンバ変数定義>
Private ThisForm As Object

'''<フォーム初期化処理>
Public Sub Form_Init(Byval Form as Object)

'''<変数セット>
Set ThisForm = Form

'''<フォーム以外の時は処理を抜ける>
If Not ThisForm.Name Like ("Frm_*") Then
'''===Dlg_*の場合に別処理を走らせる方法を検討===
Exit Sub
End If

'''<フォームの共通処理>
With ThisForm
.RecordsetType = 4
.ScrollBars = 0
.Modal = false
.Menubar = ""
~~ 中略 ~~
End With

End Sub

お礼日時:2020/10/09 10:14

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!