サーチ…
ベストプラクティス
UserForm
は、デザイナーとデフォルトのインスタンスを持つクラスモジュールです 。 コードビハインドを見ながらShift + F7を押すとデザイナーにアクセスでき、 デザイナーを見ながらF7キーを押すとコードビハインドにアクセスできます。
毎回新しいインスタンスで作業してください。
クラスモジュールなので、フォームはオブジェクトの 青写真です。フォームは状態とデータを保持できるので、デフォルト/グローバルなインスタンスではなく、クラスの新しいインスタンスで作業する方が良い方法です。
With New UserForm1
.Show vbModal
If Not .IsCancelled Then
'...
End If
End With
の代わりに:
UserForm1.Show vbModal
If Not UserForm1.IsCancelled Then
'...
End If
デフォルトのインスタンスを操作すると、フォームが赤色の "X"ボタンで閉じられている場合やコードビハインドでUnload Me
が使用されている場合に微妙なバグが発生する可能性があります。
ロジックを他の場所に実装します。
フォームは、 プレゼンテーションだけに関係する必要があります。データベースに接続し、ユーザーの入力に基づいてパラメータ化されたクエリを実行するボタンClick
ハンドラは、あまりにも多くのことをしています。
代わりに専用のモジュールとプロシージャでフォームを表示するコードのアプリケーションロジックを実装してください。
ユーザーフォームがデータの表示と収集の方法を知っている責任を負うような方法でコードを記述します。データがどこから来たのか、後でデータが発生するかは問題ではありません。
呼び出し元はコントロールを気にするべきではありません。
独自の専用クラスモジュールで、またはフォームのコードビハインド自体でカプセル化して、フォームの適切なモデルを作成し、 Property Get
プロシージャを使用してモデルを公開し、クライアントコードをこれらと連携させます。コントロールと抽象的な抽象概念を作成し、関連するデータのみをクライアントコードに公開します。
これは次のようなコードを意味します:
With New UserForm1
.Show vbModal
If Not .IsCancelled Then
MsgBox .Message, vbInformation
End If
End With
これの代わりに:
With New UserForm1
.Show vbModal
If Not .IsCancelled Then
MsgBox .txtMessage.Text, vbInformation
End If
End With
QueryCloseイベントを処理します。
フォームには通常Closeボタンがあり、プロンプト/ダイアログにはOKボタンとCancelボタンがあります。フォームのコントロールボックス (赤色の "X"ボタン)を使用してフォームを閉じることができます。これはデフォルトでフォームインスタンスを破棄します( 毎回新しいインスタンスを使用する別の理由)。
With New UserForm1
.Show vbModal
If Not .IsCancelled Then 'if QueryClose isn't handled, this can raise a runtime error.
'...
End With
End With
QueryClose
イベントを処理する最も簡単な方法は、 Cancel
パラメータをTrue
に設定し、フォームを閉じる代わりに非表示にすることです。
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
Cancel = True
Me.Hide
End Sub
そうすれば、 "X"ボタンはインスタンスを破壊することはなく、呼び出し元はすべてのパブリックメンバーに安全にアクセスできます。
隠す、閉じないでください。
オブジェクトを作成するコードは、オブジェクトを破棄する責任があります。オブジェクトをアンロードして終了するのはフォームの責任ではありません。
フォームのコードビハインドでUnload Me
を使用しないでください。 Call Me.Hide
代わりに、フォームが終了したときに作成したオブジェクトを呼び出し元のコードで使用できるようにします。
物事に名前をつける。
プロパティのツールウィンドウ( F4 )を使用して、フォーム上の各コントロールの名前を慎重に指定します。コントロールの名前はコードビハインドで使用されていますので、これを処理できるリファクタリングツールを使用していない限り、コントロールの名前を変更するとコードが壊れてしまいます。まず最初に試してみるほうが簡単ですTextBox12
が意味する20のテキストボックスのうちのどれを正確にパズルするか。
従来、UserFormコントロールには、ハンガリー語の接頭辞が付けられています。
- ユーザー名を示す
Label
コントロールのlblUserName
。 - ユーザーがユーザー名を入力できる
TextBox
コントロールのtxtUserName
。 - ユーザーがユーザー名を入力または選択できる
ComboBox
コントロールのcboUserName
。 - ユーザーがユーザー名を選択できる
ListBox
コントロールのlstUserName
。 -
btnOk
または「OK」とラベル付けされたButton
コントロールのcmdOk
。
問題は、例えばUIを再設計し、取得したときにということであるComboBox
への変更ListBox
- デカップリングすることは、彼らが何を表すかのためではなく、そのコントロールタイプの後にコントロールを命名すると良いでしょう:、名前は新しいコントロールタイプを反映するように変更する必要があります可能な限りUIからのコード。
-
UserNameLabel
は、ユーザー名を示す読み取り専用ラベルです。 - ユーザーがユーザー名を入力または選択できるコントロールの
UserNameInput
。 - "OK"と表示されたコマンドボタンの
OkButton
いずれのスタイルを選択しても、すべてのコントロールをデフォルトの名前にするよりも優れたものがあります。命名スタイルの一貫性も理想的です。
QueryCloseの処理
QueryClose
イベントは、フォームがQueryClose
とするたびに発生します。 CloseMode
パラメータには、フォームがどのように閉じられたかを示すVbQueryClose
列挙値が含まれます。
定数 | 説明 | 値 |
---|---|---|
vbFormControlMenu | フォームはユーザーの操作に応じて閉じる | 0 |
vbFormCode | フォームがUnload ステートメントに応答して閉じています | 1 |
vbAppWindows | Windowsセッションが終了しています | 2 |
vbAppTaskManager | Windowsタスクマネージャがホストアプリケーションを終了しています | 3 |
vbFormMDIForm | VBAではサポートされていません | 4 |
読みやすくするために、値を直接使用するのではなく、これらの定数を使用することをお勧めします。
Cancellable UserForm
キャンセルボタンが付いたフォームが与えられた
フォームのコードビハインドは次のようになります。
Option Explicit
Private Type TView
IsCancelled As Boolean
SomeOtherSetting As Boolean
'other properties skipped for brievety
End Type
Private this As TView
Public Property Get IsCancelled() As Boolean
IsCancelled = this.IsCancelled
End Property
Public Property Get SomeOtherSetting() As Boolean
SomeOtherSetting = this.SomeOtherSetting
End Property
'...more properties...
Private Sub SomeOtherSettingInput_Change()
this.SomeOtherSetting = CBool(SomeOtherSettingInput.Value)
End Sub
Private Sub OkButton_Click()
Me.Hide
End Sub
Private Sub CancelButton_Click()
this.IsCancelled = True
Me.Hide
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = VbQueryClose.vbFormControlMenu Then
Cancel = True
this.IsCancelled = True
Me.Hide
End If
End Sub
呼び出しコードはフォームを表示し、キャンセルされたかどうかを知ることができます:
Public Sub DoSomething()
With New UserForm1
.Show vbModal
If .IsCancelled Then Exit Sub
If .SomeOtherSetting Then
'setting is enabled
Else
'setting is disabled
End If
End With
End Sub
IsCancelled
プロパティは、[ キャンセル ]ボタンがクリックされたとき、またはユーザーがコントロールボックスを使用してフォームを閉じるときにTrue
返します 。