【问题标题】:VBA userform to execute selections only after hitting command buttonVBA用户表单仅在点击命令按钮后执行选择
【发布时间】:2017-02-26 17:35:48
【问题描述】:

我很难让 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

【问题讨论】:

  • 不要在每个复选框 _Click 事件中做你的工作,而是使用按钮的 _Clickevent。请注意,删除一行会使下面的所有行上升一。
  • 我在这里看到一个错字Applicatioin.Undo。此外,我没有看到与按下“GO”按钮相关的代码。您的复选框是带有 Click 事件的复选框吗?似乎是在按下选项时不会触发此选项时触发。 span>
  • 感谢@nbayly 指出,我试图使用UNDO 代码,但运行宏后似乎无法撤消。这就是为什么我希望宏在点击 GO 按钮之前保持操作。
  • 你好,@VincentG,我知道如果用户一直选中和取消选中复选框,就会发生不好的事情,这就是为什么我希望该操作仅在点击 GO 按钮后执行。
  • 您可以在单击“Go”时检查每个复选框的状态。您不必为每个复选框的单击事件添加代码。只需遍历所有 4 个复选框并在最终运行代码时检查状态。先撤消,然后删除所需的行。

标签: excel vba checkbox userform commandbutton


【解决方案1】:

像这样,使用“Go”按钮的_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,则 Row 中的内容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

【讨论】:

  • 谢谢!完美运行,一个快速的后续问题,我可以让 go 按钮执行上述命令并同时关闭自身吗?
  • 您希望它关闭用户窗体吗?是的,只需在End Sub 之前添加Unload Me
  • @YSCeung 还可以看到我更新的代码,删除行应该总是按反向索引顺序完成,否则会出现不希望的结果。
【解决方案2】:

只是@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

【讨论】:

  • @YSCeung,用户是否应该只选中其中一个复选框?
  • 这绝对不适用于多个复选框选择。
  • 为了强制单选,不应该使用复选框(喜欢类似 UI 的选项按钮,或者不允许多选的 ListBox/ComboBox)。
  • @DavidZemens,这就是我开始喃喃自语的原因,所以我问了 OP
  • 允许用户在需要时选中所有复选框...我也刚刚开始注意到一些问题。有没有办法解决这个问题?谢谢!
猜你喜欢
  • 2023-04-09
  • 1970-01-01
  • 2012-03-23
  • 2013-01-23
  • 1970-01-01
  • 2018-08-11
  • 1970-01-01
  • 2011-09-30
  • 2019-07-25
相关资源
最近更新 更多