Do tej pory korzystałem z poniższego VBA, aby kontynuować procedurę, jeśli użytkownik kliknął ok w 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

Teraz chcę osiągnąć dokładnie ten sam wynik, używając CommandButton1 w UserForm1.
Dlatego starałem się iść z tym:

(1) VBA w UserForm1:

Private Sub CommandButton1_Click()
Unload Me
End Sub

(2) VBA w Modul1:

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

VBA przechodzi, ale nie wprowadza wartości 1 do Cell A1.
Co muszę zmodyfikować, aby osiągnąć pożądany efekt?

0
Michi 11 marzec 2020, 18:49

2 odpowiedzi

Najlepsza odpowiedź

W odniesieniu do tego pytania użyłem zmiennej logicznej:

(1) Kod w 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) Kod w Modul1:

Sub Button_Procedure()
If UserForm1.check_procedure() = True Then
Sheet1.Range("A1").Value = 1
Else
End If
End Sub
0
Michi 18 kwiecień 2020, 14:18

Zdecydowanie sugeruję wykonanie czynności opisanych w tym artykule: Rubberduck: UserForm1.Show

Niemniej jednak prosta i brudna implementacja mogłaby wyglądać następująco:

Kod formularza znajdujący się za:

Dodaj zdarzenie do podniesienia po naciśnięciu przycisku OK-Cancel, przekazując wartość logiczną wskazującą, czy kontynuować, czy nie:

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

Prosta klasa opakowująca:

Tutaj po prostu tworzymy instancję formularza i odsłuchujemy zdarzenie 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

Wywołanie klasy opakowania:

Sub Something()

    Dim bool As Boolean

    With New FormWrapper
        bool = .Show
    End With

    MsgBox "Should I proceed? " & bool
End Sub
0
Kostas K. 11 marzec 2020, 17:01