每次更改单元格选择时如何运行子程序 - excel,vba

Pao*_*olo 4 excel vba excel-vba

长话短说:我每次点击一个单元格时都想运行一个子程序

我在excel中遇到了这个sub,我需要你的帮助.

我正在ThisWorkbook区域内编写VBA代码,因为我希望这个子代码能够在每张Sheet中运行.

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

是否可以处理此事件?

谢谢.

Mat*_*NNZ 11

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

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

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

在这种情况下,你应该使用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
Run Code Online (Sandbox Code Playgroud)

但是要小心.选择更改时,上述操作将运行,而不是单击单元格时.让我们说"点击一个单元格"是"选择一个单元格"的一个子集(因为如果你点击一个单元格,你选择一个单元格,但如果你选择一个单元格则不一定如此你点击它:你可能是通过VBA代码[ Range("A1").Select]或用鼠标向上/向下/向右/向左移动] 来选择它.因此,如果您不希望每次更改选择时都运行代码,请不要忘记管理差异.

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

Private Declare PtrSafe Function GetAsyncKeyState Lib "user32.dll" (ByVal vKey As Long) As Integer
Run Code Online (Sandbox Code Playgroud)

注意:该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
Run Code Online (Sandbox Code Playgroud)

总结一下

我引用Siddharth的评论.我已经回答了这个问题,告诉你如何做你所要求的.如果你说你想要做的是什么,将有95%肯定比我上面写的更好的解决方案.

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

Sub test()
    Dim r As Range
    r = Cells.SpecialCells(xlCellTypeVisible)
End Sub
Run Code Online (Sandbox Code Playgroud)

即使您没有选择任何单元格,该SelectionChange事件仍会被触发(因此存在错误的数据验证风险).