VBA - невозможно получить доступ ко всем членам UserForm внутри функции - PullRequest
0 голосов
/ 17 апреля 2020

Предположим, у меня есть простой проект VBA, содержащий пользовательскую форму с именем UserForm1

Если я передам UserForm1 функции в виде переменной типа Userform, я не могу получить к ней доступ все члены UserForm, например, свойство .Height, как вы видите в этом простом примере.

Чтобы получить эту работу, мне нужно передать пользовательскую форму как Object, но это довольно раздражает, так как я теряю все функции автозаполнения IDE.

    Sub CATMain()

        Call printFormHeight_Works(UserForm1)
        Call printFormHeight_Broken(UserForm1) '--> error


    End Sub


    Sub printFormHeight_Broken(ByRef form As UserForm)

        Debug.Print form.Caption '---> works!
        Debug.Print form.Height '---> Run-time error 438: Object doesn't support this property or method

    End Sub

    Sub printFormHeight_Works(ByRef form As Object)

        Debug.Print form.Caption '---> works!
        Debug.Print form.Height  '---> works!

    End Sub

Итак, мои вопросы:

  1. Почему я должен передать пользовательскую форму как Объект ?
  2. Есть ли лучший способ передать пользовательскую форму функции и получить доступ ко всем ее элементам?

1 Ответ

2 голосов
/ 17 апреля 2020

В вашем примере UserForm1 - это не только имя пользовательской формы, но и тип класса. Таким образом, вы можете передать пользовательскую форму либо по типу класса (ie. UserForm1), либо по универсальному c объекту (ie. Object).

При передаче его по типу класса подпись для функция будет ...

Sub printFormHeight_Works(ByRef form As UserForm1) 'class type is UserForm1

При передаче ее по типу generi c подпись функции будет ...

Sub printFormHeight_Works(ByRef form As Object) 'class type is Object

Как вы уже видно, что при передаче его по типу класса или объекту generi c все свойства и методы доступны. Однако IntelliSense доступен только при передаче его по типу класса.

Преимущество передачи его по объекту generi c заключается в том, что вы можете передавать его двум или более разным типам классов. Так, например, если у вас есть две пользовательские формы, UserForm1 и UserForm2, у вас есть два типа классов. И, таким образом, функция может принимать любую пользовательскую форму. Фактический тип класса разрешается во время выполнения.

Теперь, когда вы объявляете параметр как UserForm, это совершенно другой класс. И, как вы уже видели, свойства и методы меняются и несколько ограничены. В частности, метод Show недоступен. Я не знаю, в каком контексте это можно было бы использовать, но я уверен, что кто-то здесь, на SO, сможет дать объяснение.

...