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

Мне трудно заставить vba выполнить мой выбор только после нажатия кнопки команды (кнопка GO в этом случае). Приложено изображение пользовательской формы, которая не сделана с помощью элемента управления ActiveX, и код, над которым я работаю. Спасибо!

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

Private Sub MR_Click()

If MR.Value = True Then
Rows(6).Delete
End If

End Sub

Private Sub PMS_Click()

If PMS.Value = True Then
Rows(7).Delete
End If

End Sub

Private Sub VOIDMR_Click()

If VOIDMR.Value = True Then
Rows(13).Delete
End If

End Sub

Private Sub VOIDPMS_Click()

If VOIDPMS.Value = True Then
Rows(14).Delete
End If

End Sub

2 ответа

Решение

Вот так, используя кнопку "Перейти" _Click процедура события (предположительно GO_Click(), но при необходимости измените) для проверки каждого из флажков и удаления соответственно.

Private Sub GO_Click()
If MR.Value = True Then
    Rows(6).Delete
End If
If PMS.Value = True Then
    Rows(7).Delete
End If
If VOIDMR.Value = True Then
    Rows(13).Delete
End If
If VOIDPMS.Value = True Then
    Rows(14).Delete
End If
End Sub
'These event procedures won't do anything, and can be removed:
Private Sub MR_Click()
End Sub
Private Sub PMS_Click()
End Sub
Private Sub VOIDMR_Click()
End Sub
Private Sub VOIDPMS_Click()
End Sub

Флажки _Click процедуры событий больше не нужны.

Чтобы отметить процедуры события, они будут срабатывать всякий раз, когда происходит событие. Так что для флажка с _Click событие, в любое время пользователь проверяет (или снимает галочку) _Click обработчик выполнит

Как уже отмечалось, соблюдайте осторожность при удалении элементов из коллекции, так как обычно это необходимо делать в обратном порядке (когда вы удаляете строку 6, строка 7 становится строкой 6, поэтому, если проверены и MR, и PMS, то, что в строке 7 первоначально будет не удаляться). Это может потребовать некоторого дополнительного изменения кода, но очень просто кажется, просто переупорядочив команды внутри GO_Click, должен справиться с этим:

Private Sub GO_Click()
If VOIDPMS.Value = True Then
    Rows(14).Delete
End If
If VOIDMR.Value = True Then
    Rows(13).Delete
End If
If PMS.Value = True Then
    Rows(7).Delete
End If
If MR.Value = True Then
    Rows(6).Delete
End If

End Sub

Просто стилистическая вариация кода @DavidZemens:

Private Sub GO_Click()
    With Me '<-- reference the userform
        Select Case True
            Case .MR '<-- if MR checkbox control is True
                Rows(6).Delete
            Case .PMS '<-- if PMS checkbox control is True
                Rows(7).Delete
            Case .VOIDMR '<-- if VOIDMR checkbox control is True
                Rows(13).Delete
            Case .VOIDPMS '<-- if VOIPMS checkbox control is True
                Rows(14).Delete
        End Select
    End With
End Sub
Другие вопросы по тегам