質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

1回答

6086閲覧

ユーザーフォーム自体をクラス化

Tetsuya3456

総合スコア22

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2021/09/18 05:25

編集2021/09/18 05:31

下記の記事を見て、同一ユーザーフォーム内のコントロールに共通するイベントをまとめるやり方を知りました。
https://excel-ubara.com/excelvba3/EXCELFORM023.html

現在、処理が似ているユーザーフォームが複数あります。

ただ微妙に処理が違うので、それぞれ別のユーザーフォームを作成しておりますが、何とか一つのクラスモジュールにできないか試行しております。

まずは複数のユーザーフォーム内で設定しているinitializeイベントのコードが重複していたので、ユーザーフォームそのものをクラス内でプロパティとして宣言し、initializeイベントを作ってみましたが、機能しません。

withEventで設定できないコントロールとして、exit,enterなどがありますが、msforms.userformもできないという理解でよろしいでしょうか?

下記のような感じで簡単に呼び出しています。

UserForm1は実際のユーザーフォームモジュールです。
(formClass.form.show ができなかったので、とりあえず、userForm1.showにしています。)

'formClassモジュール Option Explicit Private WithEvents pForm As MSForms.UserForm Public Property Set form(ByVal aForm As MSForms.UserForm) Set pForm = aForm End Property Private Sub pForm_Initialize() MsgBox "あいうえお" End Sub '標準モジュール Sub useClassUserForm() Dim formClass As formClass Set formClass = New formClass Set formClass.form = UserForm1 UserForm1.Show end sub

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

userform の Initialize も withEvent では参照できないようです。

1つ、考えられる方法は Class の Initialize を使う方法。

formClassモジュール

vba

1Option Explicit 2 3Private WithEvents pForm As MSForms.UserForm 4 5Public Property Set form(ByVal aForm As MSForms.UserForm) 6 Set pForm = aForm 7End Property 8 9Private Sub Class_Initialize() 10 MsgBox "Class_Initialize" 11End Sub

標準モジュール

vba

1Sub useClassUserForm() 2 3 Dim formClass As formClass 4 Set formClass = New formClass 'ここで Class_Initialize 発動 5 Set formClass.form = UserForm1 6 UserForm1.Show 7 8end sub

ただし、上記のように Newした時点で呼び出されるので、Class_Initialize から UserForm1 にアクセスできません。

呼び出し時に、ユーザーフォームの設定も同時にしたいというような用途には使えません。

その場合は、疑似Initializeメソッドを作ってしまうという方法が考えられます。
この引数でユーザーフォームを渡して参照できるようにします。

formClassモジュール

vba

1Option Explicit 2 3Private WithEvents pForm As MSForms.UserForm 4 5'疑似Initialize 6Public Sub Init(ByVal aForm As MSForms.UserForm) 7 Set pForm = aForm 8 9 MsgBox "疑似Initialize" 10 pForm.Caption = "あいうえお" 'Captionを設定してみた 11 12End Sub 13 14Private Sub Class_Initialize() 15 MsgBox "Class_Initialize" 16End Sub

標準モジュール

vba

1Sub useClassUserForm() 2 3 Dim formClass As New formClass 4 formClass.Init UserForm1 'ここで 疑似Initialize 発動 5 UserForm1.Show 6 7End Sub

あるいは、ユーザーフォームのInitializeでクラスに登録するという方法でもいいでしょう。
私ならこちらの方法にします。

UserForm1モジュール

vba

1Private Sub UserForm_Initialize() 2 3 Dim formClass As New formClass 4 formClass.Init Me 5 6End Sub

標準モジュールから呼び出すときは、Showするだけですみます。

vba

1Sub useClassUserForm() 2 3 UserForm1.Show 4 5End Sub

投稿2021/09/18 07:21

編集2021/09/18 08:22
hatena19

総合スコア34075

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tetsuya3456

2021/09/18 13:09

色々な方法を提示して下さり、ありがとうございます。 自分でも一旦試してみます!
Tetsuya3456

2021/09/19 15:15

このやり方でいけました。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問