如何在每次更改单元格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的风险)。