在给定情况Excel VBA上停止消息框

Posted

技术标签:

【中文标题】在给定情况Excel VBA上停止消息框【英文标题】:Stop message box on a given situation Excel VBA 【发布时间】:2020-07-22 01:22:16 【问题描述】:

我正在使用 Excel VBA 创建一个用户表单,用于注册一些销售。表单如下所示:

您可能已经注意到,我使用图像作为按钮。这是因为 VBA 中包含的CommandButton 看起来非常过时。但是,使用图像作为按钮也会给我带来一个新错误(或不会,取决于你如何看待它),这让我发疯了。填写此信息的通常过程是输入产品、数量、价格、客户,然后单击按钮将所有信息保存到工作表中。付款textbox 只是有时会填写。

我为所有这些字段创建了一个数据验证机制,包括客户combobox。如果用户键入无效条目或单击后将字段留空,则会出现一个消息框。代码如下:

Private Sub cmbCustomer_AfterUpdate()

  If cmbCustomer.ListIndex > -1 Then
  
  Else
    MsgBox "Please choose a valid customer", vbExclamation
    cmbCustomer.Value = ""
  
  End If

End Sub

这对于避免无效条目非常有用。棘手的部分是,一旦单击按钮,所有字段都会自动删除。数据已正确保存,但如果单击之前使用的最后一个字段是 cmbCustomer(或任何其他字段,实际上,因为它们都有类似的机制来避免空数据或无效数据)并且用户决定再次开始填写表单从产品开始,出现消息框,因为它是空的并且代码检测到无效条目。我知道这是我的代码的预期行为,但是如果我使用传统的CommandButton,则不会发生这种情况,因为单击它时,焦点会转到所述按钮。如果我使用基于图像的按钮,焦点将保持在单击之前使用的最后一个文本字段上。

一种解决方案是在这种特定情况下(保存数据时)覆盖消息框。第二个是重置表单的焦点,或者将焦点设置到图像上,就像普通的CommandButton 一样。任何建议将不胜感激。

【问题讨论】:

【参考方案1】:

您可以自己做传统命令按钮自动执行的操作:将焦点设置在您想要的位置:

Private Sub cmbCustomer_AfterUpdate()

If cmbCustomer.ListIndex > -1 Then
  
  Else
    MsgBox "Please choose a valid customer", vbExclamation
    cmbCustomer.Value = ""
    myButton.SetFocus
  End If

End Sub

如果 SetFocus 不起作用,请注意您在 UI 事件链中的位置:Why is my .setfocus ignored?

如 cmets 中所述,图像按钮无法获取焦点。其背后的透明 CommandButton 可用作代理。

【讨论】:

那行不通。警告消息框不断出现。只是这次的焦点设置到了不同的textbox。而且按钮的焦点无论如何都不起作用,因为你不能将焦点设置在我相信的图像对象上。我想要做的是防止该消息框出现。 如果 VBA 不允许您聚焦图像对象,请考虑将其设置为另一个可以接受焦点但无关紧要的 UI 元素。也许是隐藏的 UI 元素或标签? 我相信会成功的。在我的图像按钮后面放置一个透明的CommandButton。这样用户甚至可以使用 TAB 来选择它。这是个好主意,谢谢你的帮助!如果您愿意将其添加到您的回复中,我将不胜感激,以便我将其标记为正确的。

以上是关于在给定情况Excel VBA上停止消息框的主要内容,如果未能解决你的问题,请参考以下文章

Excel VBA 应用程序自发停止并显示“代码执行已停止”消息

Excel VBA 停止而没有错误消息

Excel VBA 函数在完成前停止执行而没有错误消息

单击“否”替换文件时如何返回保存消息框

VBA消息框(MsgBox)

如果组合框为空,则 Excel 宏中的警告消息