Код продолжает работать после открытия немодальной пользовательской формы

Когда загружается немодальная пользовательская форма, код в ней (за исключением подпрограммы Userform_Initialize) иногда не выполняется, и основной код, вызывающий пользовательскую форму, продолжает работать.

Каким-то образом я решил эту проблему, но это было последнее обновление моей программы, которое, к сожалению, было повреждено.

Sub start() 'shortened drastically, but accurate
'....

If UBound(rs.GetRows(1000000), 2) + 1 < 6 Then
    .Close SaveChanges:=False
    ThisWorkbook.Sheets("Start").Range("DA1").Value = "1"
    ThisWorkbook.Sheets("Start").Range("DA2").Value = MachineNr
    UserForm1.Show vbModeless
    GoTo ExSub
End If 

'...
ExSub:
End Sub

И в модуле пользовательской формы:

Private Sub UserForm_Initialize()
Dim wb As Workbook

If ThisWorkbook.Sheets("Start").Bijwerken = "ja" Then
    Me.CommandButton2.Caption = "Cancel"
    Me.Label1.Caption = "Select a file to update"

    bestand = ""
    With Me.ComboBox1
        For Each wb In Application.Workbooks
        If Not wb.Name = ThisWorkbook.Name Then
            For Each sht In wb.Sheets 
                If sht.Name = "AssetTypeTask" Then
                    .AddItem wb.Name
                    Exit For
                End If
            Next sht
        End If
        Next wb
    End With

Else
    bestand = ""
    With Me.ComboBox1
        For Each wb In Application.Workbooks
        If Not wb.Name = ThisWorkbook.Name Then
            .AddItem wb.Name
        End If
        Next wb
    End With

End If
End Sub

Код проходит через подпрограмму Userform_Initialize без проблем, но пользовательская форма не отображается в передней части экрана, и код продолжается с GoTo ExSub, что затем завершает выполнение кода. Пользовательская форма остается открытой, но закрывается, когда я нажимаю на нее одну из командных кнопок.


person Tim Stack    schedule 12.02.2019    source источник
comment
ja всегда нижний регистр? Есть ли необходимость в goto?   -  person Nathan_Sav    schedule 12.02.2019
comment
Да, но при пошаговом выполнении кода это не приводит к ошибкам.   -  person Tim Stack    schedule 12.02.2019
comment
ThisWorkbook.Sheets("Start").Bijwerken что такое Bijwerken   -  person Nathan_Sav    schedule 12.02.2019
comment
Все эти переменные не вызывают ошибок. Как я уже сказал, код в UserForm_Initialize выполняется без проблем. Я использую GoTo ExSub, чтобы иметь возможность выходить из саба контролируемым образом, что может происходить в течение нескольких этапов кода.   -  person Tim Stack    schedule 12.02.2019
comment
Ознакомьтесь с этой статьей о том, как загружать пользовательские формы и ссылаться на них. rubberduckvba.wordpress.com/2017/10/25/userform1-show может это поможет   -  person Ricardo Diaz    schedule 13.02.2019
comment
Спасибо за это. Я еще не совсем все это понимаю, поскольку Джеффри Вейр сказал, что я чувствую, что держусь только ногтями за мудрость, заключенную в этом посте (и последнем), отчасти потому, что, будучи программистом-самоучкой, я просто не понимаю некоторых жаргонов. Это действительно похоже на то, что я должен прочитать, хотя   -  person Tim Stack    schedule 14.02.2019


Ответы (1)


«Выполнение кода также будет продолжаться в фоновом режиме, пока отображается немодальная форма».

Это то, что вернуло меня на ноги. Я знал это, но забыл об этом, поскольку твердо верю и до сих пор верю, что в предыдущих версиях моей программы у меня был немодальный UF запуск, который прерывал код DID.

В итоге я решил проблему с работающим кодом, добавив простой цикл для проверки состояния UF

Do Until Userform1.Visible = False
    DoEvents
Loop

Это, конечно, небольшой недостаток для ЦП, поэтому не идеально, но, поскольку это не очень интенсивная часть программы, подойдет.

Пользовательская форма, которую я использую в этом случае, должна быть немодальной, потому что пользователь должен иметь возможность прокручивать пользовательскую форму, чтобы убедиться, что они правильно заполняют элементы управления в UF. Это не программируется.

Если у кого-то есть другие способы добиться этого, дайте мне знать.

person Tim Stack    schedule 14.02.2019
comment
Взгляните на Правильно уничтожьте немодальный экземпляр Userform и другой пример класса здесь. - person T.M.; 26.03.2019