У меня есть цикл for в UserForm1, который открывает UserForm2 разное количество раз, чтобы получить соответствующий объем данных от пользователя.Ниже приведен код, выполняемый в UserForm1
Private Sub Start_Click()
Constants
InitBoard
While Not ValidTest
IncParts
Wend
End Sub
Public Sub InitBoard()
Dim row As Integer
Dim col As Integer
For Mirror = 1 To NumBlocks(2, 1)
LockType = 1
UserForm2.Show
Next Mirror
For Prism = 1 To NumBlocks(2, 2)
LockType = 2
UserForm2.Show
Next Prism
For Wormhole = 1 To NumBlocks(2, 3)
LockType = 3
UserForm2.Show
Next Wormhole
For Blocker = 1 To NumBlocks(2, 4)
LockType = 4
UserForm2.Show
Next Blocker
For Splitter = 1 To NumBlocks(2, 5)
LockType = 5
UserForm2.Show
Next Splitter
End Sub
Теперь, если я запустил код, я могу соответствующим образом получить данные в UserForm2.Когда я закрываю UserForm2 вручную с красной кнопкой «X», все работает как положено.UserForm2 снова появляется, показывая, что данные были приняты из предыдущего цикла.После того, как каждый цикл был выполнен в течение соответствующего количества раз, UserForm2 прекращает открываться, и код продолжается в UserForm1 до цикла While подпрограммы Start_Click ().Однако, если я использую Unload Me в конце подпрограммы внутри UserForm2, чтобы автоматически закрыть его после того, как он получит правильный ввод, я получу «Ошибка времени выполнения 91»: переменная объекта или переменная блока не установлена ».Когда я нажимаю Debug, строка 5 InitBoard () в приведенном выше коде подсвечивается (UserForm2.Show).Ниже приведена функция щелчка флажка, которую я использовал внутри UserForm2.комментирование строки 3 устраняет проблему, но я должен закрыть форму вручную.
Private Sub Bstate00_Click()
BoardState(0, 0) = LockType + 5
Unload Me
End Sub
Я пробовал каждую комбинацию, которую я могу придумать, чтобы загрузить UserForm2 перед показом, стараясь не завершать цикл перед UserForm2закрывается каждый раз, и даже добавление задержки безрезультатно.Me.Hide исправляет проблему, но не запускает подпрограмму UserForm2_Initialize (), необходимую для обновления информации, введенной в предыдущем цикле.
Пожалуйста, см. Ниже обсуждение разговора об ошибке 402 в комментариях минимумкод для воссоздания ошибки:
в пользовательской форме1:
Private Sub Start_Click()
For Mirror = 1 To 3
LockType = 1
With New UserForm2
.Show
End With
Next Mirror
End Sub
в пользовательской форме2:
Private Sub Bstate00_Click()
BoardState(0, 0) = LockType + 5
Me.Hide
End Sub
Private Sub UserForm_Initialize()
If BoardState(0, 0) = -1 Then
Me.Controls("BState" & 0 & 0).Value = False
Me.Controls("BState" & 0 & 0).Enabled = False
ElseIf BoardState(0, 0) = 0 Then
Me.Controls("BState" & 0 & 0).Value = False
Me.Controls("BState" & 0 & 0).Enabled = True
Else
Me.Controls("BState" & 0 & 0).Value = True
Me.Controls("BState" & 0 & 0).Enabled = False
End If
End Sub
в модуле 1:
Public BoardState(0 To 5, 0 To 5) As Integer
Public LockType As Integer