VBA MSFORMS и элементы управления — в чем разница

При добавлении элементов управления в пользовательскую форму, в чем разница между следующим. Я смущен тем, когда уместно использовать какой-либо конкретный из них.

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

person TYale    schedule 17.03.2013    source источник


Ответы (2)


Сначала добавьте пользовательскую форму. Затем в VBA IDE нажмите F2, появится обозреватель объектов. В верхнем левом углу есть поле со списком, выберите MSForms. В списке классов вы можете увидеть классы, принадлежащие библиотеке объектов MSForms.

В этом списке вы можете увидеть CommandButton и Control:

введите здесь описание изображения

Чтобы объявить в коде переменную типа CommandButton:

Dim button1 As MSForms.CommandButton
Dim button2 As CommandButton

Переменная button1 точно имеет тип CommandButton из MSForms. button2 может быть вашим собственным классом, определенным в вашем локальном проекте VBA... но если ваш локальный проект VBA не содержит никакого класса с таким именем, он также будет считаться из MSForms. Однако если вы ссылаетесь на другую библиотеку объектов, скажем, «MSFoo», которая также будет содержать класс CommandButton, вам придется объявить их полностью квалифицированными следующим образом:

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

Или как параметр в функции, которая ожидает не только один тип управления:

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

Поэтому я думаю, что использование полных имен, таких как MSForms.CommandButton, в целом уместно. Использование Control.CommandButton является неправильным и не будет компилироваться, пока вы не сошлетесь на некоторую библиотеку объектов с именем «Control» с классом CommandButton в ней.

ИЗМЕНИТЬ:

Вот пример локально созданного класса с таким же именем, как 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
person Daniel Dušek    schedule 18.03.2013

Номера 1 и 3 создают один и тот же тип управления. Первый оператор является полным, что эквивалентно использованию Dim ws в качестве WorkSheet или Dim ws в качестве Excel.WorkSheet.

Я не знаком со вторым типом — «Control.CommandButton» — и он не компилируется для меня внутри пользовательской формы в Excel 2010.

person Doug Glancy    schedule 17.03.2013