ユーザーフォームにコントロールを追加する場合、次の違いは何ですか。これらの特定の1つをいつ使用するのが適切かについて私は混乱しています。
Dim aButton1 as MSFORMS.CommandButton
Dim aButton2 as Control.CommandButton
Dim aButton3 as CommandButton
最初に UserForm を追加します。次に、VBA IDE で F2 を押すと、オブジェクト ブラウザが表示されます。左上隅にコンボ ボックスがあり、MSFormsを選択します。クラス リストには、MSForms オブジェクト ライブラリに属するクラスが表示されます。
そのリストにCommandButtonとControlが表示されます。
コードで 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 のような 同じ名前でローカルに作成されたクラスの例を次に示します。
そして、この場合のTypeNameとTypeOfのしくみ:
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
番号 1 と 3 は、同じタイプのコントロールを作成します。最初のステートメントは完全修飾されています。Dim ws as WorkSheet または Dim ws as Excel.WorkSheet を使用するのと同じです。
私は2番目のタイプ「Control.CommandButton」に慣れていません.Excel 2010のユーザーフォーム内ではコンパイルされません。