Продолжить процедуру, если нажата CommandButton - PullRequest
0 голосов
/ 11 марта 2020

До сих пор я использовал ниже VBA для продолжения процедуры, если пользователь нажал ok в MsgBox:

Sub Button_Message_Box()
Answer = MsgBox("Do you want to continue the procedure?", vbOK)
    If Answer = vbOK Then
    Sheet1.Range("A1").Value = 1
    Else
    End If
End Sub

Теперь я хочу достичь точно такой же результат, используя CommandButton1 в UserForm1.
Поэтому я попытался go с этим:

(1) VBA в UserForm1:

Private Sub CommandButton1_Click()
Unload Me
End Sub

(2) VBA в Modul1:

Sub Button_Procedure()
Call UserForm1.Show(vbModeless)
If CommandButton1 = True Then
Sheet1.Range("A1").Value = 1
Else
End If
End Sub

VBA проходит, но не вводит значение 1 в Cell A1.
Что мне нужно изменить, чтобы достичь желаемого результата?

Ответы [ 2 ]

0 голосов
/ 12 марта 2020

Применительно к этому вопросу я использовал логическую переменную:

(1) Код в UserForm1:

Private continue_procedure As Boolean

Private Sub CommandButton1_Click()
continue_procedure = True
Unload Me
End Sub

Function check_procedure() As Boolean
UserForm1.Show
check_procedure = continue_procedure
End Function

(2) Код в Modul1:

Sub Button_Procedure()
If UserForm1.check_procedure() = True Then
Sheet1.Range("A1").Value = 1
Else
End If
End Sub
0 голосов
/ 11 марта 2020

Я настоятельно рекомендую выполнить действия, описанные в этой статье: Rubberduck: UserForm1.Show

Тем не менее, простая и грязная реализация может выглядеть следующим образом:

Код формы:

Добавление события, которое вызывается при нажатии кнопки OK-Cancel, передавая логическое значение, указывающее, продолжать или нет:

Public Event OnClose(ByVal bool As Boolean)

Private Sub CmdOK_Click()
    RaiseEvent OnClose(True)
End Sub

Private Sub CmdCancel_Click()
    RaiseEvent OnClose(False)
End Sub

Простой класс-оболочка:

Здесь мы просто создаем экземпляр формы и слушаем событие OnClose().

Option Explicit

Private WithEvents objForm As UserForm1
Private m_flag As Boolean

Public Function Show() As Boolean
    Set objForm = New UserForm1
    objForm.Show ' No vbModeless here, we want to halt code execution
    Show = m_flag
End Function

Private Sub CloseForm()
    Unload objForm
    Set objForm = Nothing
End Sub

Private Sub objForm_OnClose(ByVal bool As Boolean)
    m_flag = bool
    CloseForm
End Sub

Вызов класса-оболочки:

Sub Something()

    Dim bool As Boolean

    With New FormWrapper
        bool = .Show
    End With

    MsgBox "Should I proceed? " & bool
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...