For Each sh In wb.Sheets
ListBox1.AddItem sh.Name
Next sh
Объект sh
имеет смысл только внутри For...Next
петли.
В теории , каксогласно спецификациям языка, sh
должен действительно содержать ссылку на последний элемент в повторяющейся коллекции:
- Когда
<for-each-statement>
завершит выполнение,значение <bound-variable-expression>
- это значение данных последнего элемента в <collection>
.
https://docs.microsoft.com/en-us/openspecs/microsoft_general_purpose_programming_languages/MS-VBAL/b132463a-fd25-4143-8fc7-a443930e0651
Однако оно появляется при внедрении VBA,эта точка маркера не была: переменная For Each
, которая Nothing
перед циклом, все равно будет Nothing
после цикла - и любой вызов члена, сделанный против Nothing
, всегда вызовет ошибку 91.
Если честно, я тоже думаю, что так будет лучше: это заставляет ваш код быть более явным:
Dim lastSheet As Worksheet
Dim sh As Worksheet
For Each sh In wb.Worksheets '<~ note: 'Sheets' collection can have charts, not just worksheets
ListBox1.AddItem sh.Name
Set lastSheet = sh
Next
With New BillSelect '<~ forms are objects too; avoid using their global state
.Show
End With
lastSheet.Activate
lastSheet.Range("A1").Select
Примечание: New
появление BillSelect
может выявлять скрытые ошибки вкод вашей формы, прочитайте эту статью для получения дополнительной информации.
Обработчик Initialize
не должен выполнять эту работу, espособенно , если вы не New
заполняете форму и не используете ее экземпляр по умолчанию : вы не контролируете, когда создается этот экземпляр по умолчанию, VBA делает.
Учитывая этот код:
UserForm1.Show
Если ни один код ранее не ссылался на UserForm1
, то обработчик Initialize
запускает при UserForm1
, до , ссылка возвращаетсявызывающему абоненту и выполняется .Show
вызов;если экземпляр формы по умолчанию не уничтожен, то при следующем отображении формы обработчик инициализации больше не будет запускаться , поскольку экземпляр уже инициализирован.
Рассмотрите возможность реализации вашей логикивместо этого в обработчике Activate
, который заставит логику работать после вызова .Show
и каждый раз форма активируется (и поскольку это модальное диалоговое окно,это означает, что каждый раз, когда форма действительно отображается).