点击单元格时如何运行代码?

4
我知道可以使用Worksheet_SelectionChange,但这并不完全符合我的要求。
例如,当我使用箭头键移动活动单元格时,它仍然会运行代码。 我该如何只在实际点击单元格时运行代码?

2
有右键和双击,但没有左键(那将是一场噩梦 XD) - findwindow
@findwindow 我使用两种按钮。一个用于隐藏/显示一些预定义的行。另一个仅更改具有预定义值的其他单元格的值,但此按钮需要类似于单选按钮的工作方式。 - jvh
@findwindow 我已经问过那个问题了。基本上,那个问题的答案是“这是Excel的一个错误,无法修复”。 - jvh
2
请查看我的答案这里 - EngJon
以下是获取按键信息的Windows代码。您可以记录箭头按键的按下时间。然后,在selectionchanged事件开始处放置一个检查,如果最后一个按下的键是箭头键且在几分之一秒内,则退出。如果为真,则退出。 https://dev59.com/zWgu5IYBdhLWcg3wrY0m - MatthewD
显示剩余8条评论
2个回答

3
您也可以检测左键点击。我在这里回答了一个类似的问题: here 将以下代码插入到特定的工作表模块中(例如 "Sheet1"):
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If (GetAsyncKeyState(vbKeyLButton)) Then 'left mouse button
            'do something here
    End If
End Sub

此外,您需要在普通模块(例如标准的“Module1”)的顶部插入以下部分:

Public Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer

那就是这样,部分“在这里做某事”的部分可以根据您的需求填写。
然而,这种方法有一些缺陷:如果你执行一个以点击结束的操作(例如消息框),下一个使用箭头键进行选择更改的操作也会触发该事件并重新执行你的操作。为了规避这个问题,在selectionChange子程序的末尾添加一个额外的“空”: If (GetAsyncKeyState(vbKeyLButton)) Then 'left mouse button 'blank End If 正如我所说,还存在其他缺陷,因此这不会禁用Excel中所有不需要的行为。另一个问题是在Excel的其他位置单击(例如选择另一个功能区),然后通过箭头键更改单元格的选择。很遗憾,我没有找到对此的解决方案。

尝试过了,但无法使其正常工作。没有错误提示,也没有任何反应。 - jvh
你必须确保每样东西都摆放在正确的位置。worksheet_selectionchange事件必须放置在工作表所在的模块中,而不是“此工作簿”。并且declare语句必须放置在普通的模块中(比如插入一个module1)。 - EngJon
双重检查和三重检查。一切都在正确的位置。 - jvh
如果您跳过了关键检查,那么选择更改功能是否按预期工作? - EngJon
@JentevanHeuverswyn 我猜你已经用实际代码替换了 do something here?只是问一下。 - EngJon

2
左键单击无法在Excel应用程序的VBA中被捕获。有一些方法可以全局检查左键是否按下,但从我收集到的信息来看,这似乎不是简单可靠的。参见:

http://www.experts-exchange.com/Software/Office_Productivity/Office_Suites/MS_Office/Excel/Q_28343702.html(基本上是您提出的同样问题)

SelectionChange不能仅适用于鼠标:http://excel.tips.net/T003070_Mouse_Click_Event_in_VBA.html

经过大量搜索,网络上没有关于此的确切结论。这可能不是您要寻找的答案,但我认为您不会找到您想要的东西。


至于缺乏“官方”文档... MSDN 对于在 VBA 中实现的内容很好,但并未说明不能完成的任务。 - David G
好的,感谢你的努力。我想selectionChange就可以了。 - jvh
@JentevanHeuverswyn 这不是真的。请查看我对类似问题的回答:这里 - EngJon
@EngJon 很好!这是一个启示。当我尝试它时,我遇到了编译错误,但如果你能让它为他工作,他看到你的评论后我会立即删除我的回答。如果你发布你的答案,我会删除我的。 - David G
看起来你最初的解决方案在下面的评论中没有得到解决。他最终是否能够按照预期工作呢?我也需要知道这个结果,为了个人使用,哈哈 :D - David G
@DavidG,你的编译错误是什么?它可能可以通过这个链接解决。 - EngJon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接