Events 命令按钮上带有MouseMove事件的VBA Excel事件编译错误

Events 命令按钮上带有MouseMove事件的VBA Excel事件编译错误,events,excel,compiler-errors,vba,Events,Excel,Compiler Errors,Vba,我试图将MouseMove事件与命令按钮一起使用,但无法确定如何防止以下错误: 编译错误: 过程声明与具有相同名称的事件或过程的描述不匹配 代码非常简单。我在这里使用了伪代码,因为我永远无法输入事件处理程序来获取有用的内容 Private Sub Button_Name_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) Dim X as Integer x = x+1 End Sub 我直接

我试图将MouseMove事件与命令按钮一起使用,但无法确定如何防止以下错误:

编译错误: 过程声明与具有相同名称的事件或过程的描述不匹配

代码非常简单。我在这里使用了伪代码,因为我永远无法输入事件处理程序来获取有用的内容

Private Sub Button_Name_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
  Dim X as Integer
  x = x+1
End Sub

我直接从对象浏览器获取了参数列表。我在其他事件中得到了类似的结果,包括DblClick,但没有Click。我想我一定是犯了一些根本性的错误,但我一直没能识别出来。救命啊

我不太明白您为什么直接从对象浏览器获取参数列表。如果在VBA窗口中打开了用户窗体的代码,则可以在代码上方的左下拉列表中选择command按钮,并在右下拉列表中选择MouseMove事件。然后自动插入所需的代码。它将与您的代码略有不同:

Private Sub CommandButton1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal Y As Single)

End Sub
您将遇到的下一个错误是X的重复声明。它已经是子例程的一个参数。因此不能在子例程中重用它


这两件事解决后,鼠标移动事件将触发,即使是在命令按钮上。

我不太明白为什么您直接从对象浏览器获取参数列表。如果在VBA窗口中打开了用户窗体的代码,则可以在代码上方的左下拉列表中选择command按钮,并在右下拉列表中选择MouseMove事件。然后自动插入所需的代码。它将与您的代码略有不同:

Private Sub CommandButton1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal Y As Single)

End Sub
您将遇到的下一个错误是X的重复声明。它已经是子例程的一个参数。因此不能在子例程中重用它


修复这两个问题后,即使在命令按钮上,鼠标移动事件也会触发。

发生错误的原因是您更改了默认参数规范并删除了ByVal。如果在选择了左上下拉菜单中的命令按钮后,从VBA编辑器的右上下拉菜单中选择MouseMove,则会自动显示正确的参数规范。参数规范不应更改,否则将无法工作。VBA需要这个特定的参数列表,如果它发现一些不同的参数,它将不会编译。唯一可以更改的是参数变量的名称,而不是其他

这项工作:

Private Sub CommandButton1_MouseMove(ByVal Button As Integer, _
    ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)

    X = X + 1 ' or whatever you need to do with X and Y
    MsgBox "MouseMove! " & X & " " & Y

End Sub
我必须承认,我发现在命令按钮上使用MouseMove事件是一件非常奇怪的事情——但也许你有你的理由?我当然想听


此外,正如@Codo所指出的,您不应该在Sub中重新声明X。它已经被声明为Sub的参数,您可以直接使用它,例如X=X+1或其他。您不必使用Dim重新声明它-事实上,这样做会产生编译时错误。

发生错误的原因是您更改了默认参数规范并删除了ByVal。如果在选择了左上下拉菜单中的命令按钮后,从VBA编辑器的右上下拉菜单中选择MouseMove,则会自动显示正确的参数规范。参数规范不应更改,否则将无法工作。VBA需要这个特定的参数列表,如果它发现一些不同的参数,它将不会编译。唯一可以更改的是参数变量的名称,而不是其他

这项工作:

Private Sub CommandButton1_MouseMove(ByVal Button As Integer, _
    ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)

    X = X + 1 ' or whatever you need to do with X and Y
    MsgBox "MouseMove! " & X & " " & Y

End Sub
我必须承认,我发现在命令按钮上使用MouseMove事件是一件非常奇怪的事情——但也许你有你的理由?我当然想听


此外,正如@Codo所指出的,您不应该在Sub中重新声明X。它已经被声明为Sub的参数,您可以直接使用它,例如X=X+1或其他。您不必使用Dim重新声明它-事实上,这样做会产生编译时错误。

我认为您误解了事件驱动编程的方面。移动鼠标时将触发MouseMove事件。它从未被调用或分配给按钮。如果你按下一个按钮时需要一些事情发生,把它放在按钮的点击处理程序中。我认为你误解了事件驱动编程方面。移动鼠标时将触发MouseMove事件。它从未被调用或分配给按钮。如果您需要在按下按钮时发生某些事情,请将其放入按钮的单击处理程序中。谢谢。你的回答恰到好处。我从VBA语言引用中获取了我的原始参数列表,其中省略了ByVal。X只是伪代码,不在真正的清单中。谢谢。你的回答恰到好处。我从VBA语言引用中获取了我的原始参数列表,其中省略了ByVal。X只是伪代码,不在真正的清单中。谢谢。像
如上所述,添加ByVal修正了问题。我最初使用MouseMove的想法是,当相关的命令按钮被鼠标移过时,显示一个文本框。谢谢。如上所述,添加ByVal可以纠正问题。我最初使用MouseMove的想法是,当相关的命令按钮被鼠标移过时,显示一个文本框。