Вопрос:
При добавлении элементов управления в пользовательскую форму, в чем разница между следующим. Я смущен, когда целесообразно использовать какой-либо из них.
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.