サーチ…


ベストプラクティス

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返します



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow