gpt4 book ai didi

excel - 无模式表单上文本框输入的验证消息会中断文本选择

转载 作者:行者123 更新时间:2023-12-02 09:02:24 24 4
gpt4 key购买 nike

您好,我在用户表单中尝试此代码,检查 textbox1 中输入的数据是否为数字,如果不是,则向用户显示 msgbox 并选择 中的文本>textbox1,但当用户窗体为 vBModeless

时,下面的代码不会选择 textbox1 中的文本
Private Sub TextBox1_Change()
If Not IsNumeric(TextBox1) Then
MsgBox " only number"
TextBox1.SetFocus
TextBox1.SelStart = 0
TextBox1.SelLength = Len(TextBox1.Text)
End If
End Sub

有什么解决办法吗?

最佳答案

问题的根源不是选择,因为它就在那里并且按预期工作:

Private Sub TextBox1_Change()
If Not IsNumeric(TextBox1) Then
MsgBox " only number"
TextBox1.SetFocus
TextBox1.SelStart = 0
TextBox1.SelLength = Len(TextBox1.Text)
Debug.Print TextBox1.SelText
End If
End Sub

我认为这里的根本问题是 MSForms 控件不是真正的窗口,而是没有窗口句柄的“无窗口”实体(当然,也有异常(exception),例如列表框、选项卡条、多页),这很容易可以通过隐藏方法进行测试:

'Which obviously returns a zero.
Debug.Print TextBox1.[_GethWnd]

另一方面,有窗口的消息传递模型,其中每个控件都是一个窗口(因此是 Windows 操作系统),具有适当的窗口句柄,并且能够发送和接收消息,例如 WM_SETFOCUS/ WM_KILLFOCUS 并采取适当的行动。回到 MSForms - UserForm 在内部管理外部世界和子控件之间的所有交互。

我们首先声明 WIN API 函数 GetFocus :

Public Declare Function GetFocus Lib "user32.dll" () As Long

让我们添加一些 Debug.Print 来看看发生了什么:

Private Sub TextBox1_Change()
If Not IsNumeric(TextBox1) Then
Debug.Print "--"
Debug.Print GetFocus
MsgBox " only number"
Debug.Print GetFocus
TextBox1.SetFocus
Debug.Print GetFocus
Debug.Print "--"
TextBox1.SelStart = 0
TextBox1.SelLength = Len(TextBox1.Text)
End If
End Sub

这会产生这个序列:

--
<userform hwnd>
<outer hwnd>
<outer hwnd>
--

正如您所看到的 - SetFocus 没有任何效果,因为用户窗体不知道焦点已丢失(因此也没有 Exit 事件)。要解决此问题,您应该通过将焦点转移到另一个子控件或切换 Enabled (甚至 Visible)属性来显式失去焦点:

Private Sub TextBox1_Change()
If Not IsNumeric(TextBox1) Then
Debug.Print "--"
Debug.Print GetFocus
TextBox1.Enabled = False
'or use CommandButton1.SetFocus or something
MsgBox " only number"
TextBox1.Enabled = True
Debug.Print GetFocus
TextBox1.SetFocus
Debug.Print GetFocus
Debug.Print "--"
TextBox1.SelStart = 0
TextBox1.SelLength = Len(TextBox1.Text)
End If
End Sub

这会产生所需的外观和正确的顺序:

--
<userform hwnd>
<outer hwnd>
<userform hwnd>
--

总而言之,原因是内部和外部焦点状态不同步,这是由于 MSFormsWinForms/ 之间的管理模型略有不同WinAPI 加上非模态工作机制,将两者混合在一起,从而有机会将注意力集中到非 MSForms 上。

关于excel - 无模式表单上文本框输入的验证消息会中断文本选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53392937/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com