5

ユーザーフォームにコントロールを追加する場合、次の違いは何ですか。これらの特定の1つをいつ使用するのが適切かについて私は混乱しています。

Dim aButton1 as MSFORMS.CommandButton
Dim aButton2 as Control.CommandButton
Dim aButton3 as CommandButton
4

2 に答える 2

16

最初に UserForm を追加します。次に、VBA IDE で F2 を押すと、オブジェクト ブラウザが表示されます。左上隅にコンボ ボックスがあり、MSFormsを選択します。クラス リストには、MSForms オブジェクト ライブラリに属する​​クラスが表示されます。

そのリストにCommandButtonControlが表示されます。

ここに画像の説明を入力

コードで CommandButton 型の変数を宣言するには、次のようにします。

Dim button1 As MSForms.CommandButton
Dim button2 As CommandButton

変数 button1 は確かに MSForms の CommandButton 型です。button2は、ローカル VBA プロジェクトで定義された独自のクラスである可能性がありますが、ローカル VBA プロジェクトにそのような名前のクラスが含まれていない場合は、MSForms からも考慮されます。ただし、クラス CommandButton も含む「MSFoo」などの別のオブジェクト ライブラリを参照する場合は、次のように完全修飾宣言する必要があります。

Dim button1 As MSForms.CommandButton
Dim button2 As MSFoo.CommandButton

コードで Control 型の変数を宣言するには、次のようにします。

Dim controlObject As MSForms.Control

コントロールの基本クラスのような種類の Control の変数を使用します。たとえば、Controls コレクションを列挙するには:

For Each controlObject In Me.Controls
    Debug.Print VBA.TypeName(controlObject)
Next controlObject

または、1 種類のコントロールだけでなく、関数内のパラメーターとして:

Private Sub PrinControlName(ByRef c As MSForms.Control)
    Debug.Print c.Name
End Sub

したがって、MSForms.CommandButton のような完全修飾名を使用することは、一般的に適切だと思います。Control.CommandButton の使用は間違っており、クラス CommandButton を含む「Control」という名前のオブジェクト ライブラリを参照するまでコンパイルされません。

編集:

MSForm.CommandButton のような 同じ名前でローカルに作成されたクラスの例を次に示します。ここに画像の説明を入力

そして、この場合のTypeNameTypeOfのしくみ:

Option Explicit

Private m_buttonMsForms As MSForms.CommandButton
Private m_buttonLocal As CommandButton

Private Sub UserForm_Initialize()
    Set m_buttonMsForms = Me.Controls.Add( _
        "Forms.CommandButton.1", "testMsButton", True)
    Set m_buttonLocal = New CommandButton

    m_buttonLocal.Name = "testLocalButton"

    Debug.Print "We have two instances of two different button types: " & _
        m_buttonLocal.Name & " and " & m_buttonMsForms.Name

    ' Check instances with TypeName function
    ' TypeName function returns same results
    If VBA.TypeName(m_buttonMsForms) = VBA.TypeName(m_buttonLocal) Then
        Debug.Print "TypeName of both buton types returns same result"
    End If

    ' Check instances with TypeOf operator
    ' TypeOf doen't work with not initialised objects
    If m_buttonLocal Is Nothing Or m_buttonMsForms Is Nothing Then _
        Exit Sub

    ' TypeOf operator can distinguish between
    ' localy declared CommandButton type and MSForms CommandButton
    If TypeOf m_buttonLocal Is MSForms.CommandButton Then _
        Debug.Print "m_buttonLocal Is MSForms.CommandButton"

    If TypeOf m_buttonMsForms Is CommandButton Then _
        Debug.Print "m_buttonMsForms Is CommandButton"

    If TypeOf m_buttonLocal Is CommandButton Then _
        Debug.Print "m_buttonLocal Is CommandButton"

    If TypeOf m_buttonMsForms Is MSForms.CommandButton Then _
        Debug.Print "m_buttonMsForms Is MSForms.CommandButton"

End Sub

出力:

We have two instances of two different button types: testLocalButton and testMsButton
TypeName of both buton types returns same result
m_buttonLocal Is CommandButton
m_buttonMsForms Is MSForms.CommandButton
于 2013-03-18T00:59:34.843 に答える
2

番号 1 と 3 は、同じタイプのコントロールを作成します。最初のステートメントは完全修飾されています。Dim ws as WorkSheet または Dim ws as Excel.WorkSheet を使用するのと同じです。

私は2番目のタイプ「Control.CommandButton」に慣れていません.Excel 2010のユーザーフォーム内ではコンパイルされません。

于 2013-03-17T13:46:09.060 に答える