Excel用户表单:鼠标事件的神秘行为

我有一个关于excel用户表单和鼠标事件的问题。 我有两个用户表单,userform1和userform2的项目。 Userform2是空的,没有控件,没有代码。 userform1(包含一个文本框)的codemodule包含以下代码:

Private Sub TextBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) Debug.Print "D (" & X & "," & Y & ")" UserForm2.Show False End Sub Private Sub TextBox1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) Debug.Print "U (" & X & "," & Y & ")" End Sub 

问题是:当我在文本框上并按下鼠标左键时,发生了mousedown事件,但释放鼠标时没有发生mouseup事件。 此外,鼠标似乎被捕获为下一个鼠标按下,即使没有textbox1生成textbox1 mousedown事件。 我正在使用Excel 2013和Windows 10。

这与事件传播有关。 您正在捕获MouseDown事件。 从这个事件的事件处理者,你正在把焦点从这个事件引发的元素上撕下来。 所以这个事件可能会冒泡到新的焦点元素。

Excel-VBA我们没有太多的可能性来影响事件传播。 所以我们不能明确地停止事件传播。

但是,为什么你认为你需要从MouseDown事件显示UserForm2 ? 为什么不从MouseUp事件? 问题是一样的,但是一个MouseUp事件不会造成太大的损害,如果对错误的对象进行布局。

 Private Sub TextBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) Debug.Print "D (" & X & "," & Y & ")" End Sub Private Sub TextBox1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) Debug.Print "U (" & X & "," & Y & ")" Load UserForm2 UserForm2.Show False End Sub