Какой режим отображения следует использовать для пользовательской формы VBA для отображения данных, управления ими и подтверждения их корректности? - PullRequest
0 голосов
/ 24 января 2019

У меня запланирована следующая процедура:

1.Пользователь выбирает данные, используя пользовательские формы

2.Пользователь просматривает данные, используя обычный Excel

3.Пользователь подтверждает, что данные в порядке (например, с пользовательской формой)

4.данные сохраняются

Все в одной программе VBA.

Вот мой прототип:

Модуль:

Sub ControlDataUI()
Dim Ui As New UserForm1
Dim Confirmend as Boolean
Debug.Print "dostuff"

With Ui
    .Show (False) 'or .Show(True)
    While Not .IsHiden
    Wend
    Confirmed=.Confirmed
End With

Debug.Print "Do some more stuff!"

If Confirmed then Call SaveStuff 

Debug.Print "I will die!!"
End Sub

Userform1:

Private Type TView
    IsCancelled As Boolean
    Confirmed As Boolean
    IsHiden As Boolean
End Type

Private this As TView

Public Property Get Confirmed() As Boolean
    Confirmed = this.Confirmed
End Property
Public Property Get IsHiden() As Boolean
    IsHiden = this.IsHiden
End Property

Private Sub CommandButton1_Click()
Debug.Print "YES!!!!"
this.Confirmed = True
this.IsHiden = True
Me.Hide
End Sub

Private Sub CommandButton2_Click()
Debug.Print "NO?!?!"
this.Confirmed = False
this.IsHiden = True
Me.Hide
End Sub

Private Sub UserForm_Terminate()
Debug.Print "Murder! I was killed!"
End Sub

Теперь проблема:

Без режима

При использовании режима без режима отображается пользовательская форма, но код продолжает работать до завершения.Я пытался остановить выполнение кода с помощью While Not .IsHiden конструкции.Код замораживает Excel, потому что это бесконечный цикл.Так что это исключено. Есть ли способ реализовать это с немодальным дисплеем?

Модальный

Если я использую модальный дисплей, использование Excel блокируется иотображается только пользовательская форма.

В заключение: как модальное, так и немодальное отображение не позволяют пользователю управлять данными на листе.Есть ли решение этой проблемы?

1 Ответ

0 голосов
/ 24 января 2019

Я понял!

Решение проблемы заключается в следующем: DoEvents

Модуль

Sub ControlDataUI()
Dim Ui As New UserForm1
Dim IsConfirmed As Boolean

Debug.Print "dostuff"

Application.ScreenUpdating=True
With Ui
    .Show (0)
    While Not .IsHiden
        DoEvents
    Wend
    If .IsCancelled Then Exit Sub
    IsConfirmed = .Confirmed
End With

Debug.Print "Do some more stuff!"

If IsConfirmed Then
    Debug.Print "SaveStuff"
End If

Debug.Print "I will die!!"
End Sub

UserForm

Private Type TView
    IsCancelled As Boolean
    Confirmed As Boolean
    IsHiden As Boolean
End Type

Private this As TView
Public Property Get IsCancelled() As Boolean
    IsCancelled = this.IsCancelled
End Property
Public Property Get Confirmed() As Boolean
    Confirmed = this.Confirmed
End Property
Public Property Get IsHiden() As Boolean
    IsHiden = this.IsHiden
End Property

Private Sub CommandButton1_Click()
Debug.Print "YES!!!!"
this.Confirmed = True
this.IsHiden = True
Me.Hide
End Sub

Private Sub CommandButton2_Click()
Debug.Print "NO?!?!"
this.Confirmed = False
this.IsHiden = True
Me.Hide
End Sub

Private Sub UserForm_Click()

End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
this.IsCancelled = True
Me.Hide
End Sub

Private Sub UserForm_Terminate()
Debug.Print "Murder! I was killed!"
End Sub

Таким образом, идея была в правильном направлении, но цикл while должен был содержать DoEvents для обработки событий, приходящих от пользователя.

Резюме:

1.Немодальная форма пользователя

2.В то время как цикл с DoEvents, пока пользователь не подтвердит

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

Благодаря @Tom и @ Zac

...