如何在每次更改单元格select时运行子工具 – excel,vba

长话短说是:我想每次点击一个单元格运行一个子

我在这里坚持这个在Excel中的子,我需要你的帮助。

我在ThisWorkbook区域内编写了一个VBA代码,因为我希望这个子代码能够运行在它的每一张表格中。

我的目标是:当我点击一个单元格(无关紧要)时,子运行,进行一些检查,然后在特定的单元格(在同一个活动工作表)中写入结果。

可以处理这个事件吗?

谢谢。

您必须使用Workbook对象的SheetChange方法:

 Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) 'run code everytime one of the sheets is changing End Sub 

对不起,我刚刚读了更好的: 当我点击一个单元格 (无关紧要),子运行,进行一些检查,然后写入特定的单元格(在同一个活动工作表)的结果。

在这种情况下,您应该使用Workbook_SheetSelectionChange

 Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) 'run code everytime one of the sheets' cells is selected End Sub 

但是,要小心。 上面的代码会在select改变时运行,而不是当你点击一个单元格时。 假设“点击一个单元格”是一个“select一个单元格”的子集(因为如果你点击一个单元格,你将select一个单元格,但是如果你select一个单元格你点击它:你可以通过VBA代码[ Range("A1").Select]或通过鼠标向上/向下/向右/向左移动来select它。 所以不要忘记pipe理差异,如果你不希望你的代码每次运行select被改变。

要预测下一个问题(如何区分点击或不点击?),您可以使用user32.dll API来获取点击:

 Private Declare PtrSafe Function GetAsyncKeyState Lib "user32.dll" (ByVal vKey As Long) As Integer 

注意: PtrSafe关键字用于在64位系统中声明API。 如果你有一个32位的,只需从API声明中拿出来。

 Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) Dim check As Boolean check = GetAsyncKeyState(1) '<-- True if click, False if not click If check Then '<-- if click... 'run code everytime one of the sheets' cells is selected and you intercept a click End If End Sub 

总结

我引用Siddharth的评论。 我已经回答了这个问题,告诉你如何去做你所要求的 。 如果你说出你想要做的事情,那么95%肯定会有比上面写的更好的解决scheme。

如果你想知道为什么你不应该100%信任SelectionChange (信用额度为Siddharth),在表单中隐藏一行,然后运行这个macros(把它放到一个标准模块中):

 Sub test() Dim r As Range r = Cells.SpecialCells(xlCellTypeVisible) End Sub 

即使你没有select任何单元格, SelectionChange事件也会被触发(所以冒着错误的数据validation的风险)。