gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:18:03 25 4
gpt4 key购买 nike

长话短说:我想在每次单击单元格时运行子程序

我被 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

不过,要小心。上面的代码将在选择更改时运行,而不是在您单击单元格时运行。假设“单击单元格”是“选择单元格”的子集(因为如果您单击一个单元格,则您正在选择一个单元格,但如果您正在选择一个单元格,则不一定正确)您点击它:您可能通过 VBA 代码 [Range("A1").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

总结

我引用悉达多的评论。我回答这个问题是为了向您展示如何按照您的要求进行操作。如果您说出您到底想要做什么,95% 肯定会有比我上面写的解决方案更好的解决方案。

如果您想了解为什么永远不应该 100% 信任 SelectionChange(感谢 Siddharth 提供的提示),请在工作表中隐藏一行,然后运行此宏(将其放入标准模块):

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

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

关于vba - 如何在每次更改单元格选择时运行子程序 - excel、vba,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30382291/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com