VBA MSFORMS vs Controls – в чем разница

Вопрос:При добавлении элементов управления в пользовательскую форму, в чем разница между следующим. Я смущен, когда целесообразно использовать какой-либо из них. Dim aButton1 as MSFORMS.CommandButton Dim aButton2 as Control.CommandButton Dim aButton3 as CommandButton Лучший ответ: Добавить UserForm сначала. Затем в VBA IDE нажмите F2, появится экран объекта. В левом верхнем углу находится поле со списком, выберите

Вопрос:

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

Dim aButton1 as MSFORMS.CommandButton Dim aButton2 as Control.CommandButton Dim aButton3 as CommandButton Лучший ответ:

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

В этом списке можно увидеть CommandButton и Контроль:

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

Dim button1 As MSForms.CommandButton Dim button2 As CommandButton

Переменная button1 имеет тип CommandButton из MSForms. Кнопка 2 может быть вашим собственным классом, определенным в вашем локальном проекте 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.

EDIT:

Вот пример локально созданного класса с тем же именем, что и 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

Числа 1 и 3 создают один и тот же тип управления. Первое утверждение просто полностью квалифицировано – эквивалентно использованию Dim ws как WorkSheet или Dim ws как Excel.WorkSheet.

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

Оцените статью
Добавить комментарий