在给定情况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上停止消息框的主要内容,如果未能解决你的问题,请参考以下文章