VBA: проблема с передачей аргументов в пользовательскую форму - PullRequest
1 голос
/ 18 сентября 2019

Я искал и пытался в течение 6 часов, но не могу решить проблему.

Моя идея: я хочу показать пользовательскую форму в Excel-VBA с несколькими радиокнопками, одним элементом и одним текстовым полем.Я хочу передать некоторые аргументы пользовательской форме для работы с ней, потому что я не хочу вычислять внутри кода пользовательской формы (который работает). Я также не хочу объявлять глобальные переменные.

Я пыталсяследующее, которое сработало:

  • вычислить непосредственно в пользовательской форме

  • глобальные переменные

Это hasnне работали:

  • объявили пользовательскую форму переменной и работали с переменной

  • каждая возможная комбинация [Public|Private|Friend] Property Let (ByRef|ByVal)

  • Property Set не работает ни в коем случае

Код из моего основного (модуля)

Option Explicit

Sub main()
    With New usr_mainInput
        .counter = 3
        .Show
    End With
End Sub

Мой код в пользовательской форме

Option Explicit

Private miCounter As Integer

Property Get counter() As Integer
    counter = miCounter
End Property
Property Let counter(c As Integer)
    Set miCounter = c
End Property

Private Sub userform_initialize()
    Dim i As Integer
    For i = 1 To counter           'miCounter don't work as well
        Debug.Print i
    Next i
End Sub

Private Sub btn_ok_Click()
    Me.Hide
End Sub

Переменная объекта или С переменной блока не установлено

Если дело доходит до Property Let counter(), то сбрасывается ошибка компиляции:

Требуется объект (Ошибка424)

1 Ответ

2 голосов
/ 19 сентября 2019
Property Let counter(c As Integer)
    Set miCounter = c
End Property

Объект требуется , только из-за ключевого слова Set.Это не ссылочное присвоение, это присвоение значения.

Просмотрите его так:

Property Let counter(c As Integer)
    Let miCounter = c
End Property

Просто на самом деле не вводите ключевое слово Let (оно будет работать, хотя), устарел :)

Также обратите внимание, что неявный модификатор для Property Let/Set аргумента процедуры всегда Byval - это отличается от всего остального вVBA, где неявный модификатор thr равен ByRef;рассмотрите возможность сделать модификатор ByVal явным.


Private Sub userform_initialize()
    Dim i As Integer
    For i = 1 To counter           'miCounter don't work as well
        Debug.Print i
    Next i
End Sub

Этот цикл никогда ничего не будет повторять, потому что здесь выполняется обработчик Initialize:

With New usr_mainInput

Я имею в виду, что он запускается, когда возвращается инструкция New usr_mainInput, , но перед тем, как ссылка на объект передается в блок With (обратите внимание, что это верно для любого класса,не только формы) - это задолго до назначения .counter = 3!Основное правило: вы хотите инициализировать состояние экземпляра в этом обработчике, а не использовать его.

Рассмотрите возможность использования обработчика Activate.Тот будет работать сразу после .Show вызова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...