如何区分 excel vba 上的手动单元格更改和自动单元格更改
how to distinguish between manual cell change and automatic cell change on excel vba
希望你一切顺利
我有一个 sheet,其中有项目团队成员。它包含两行:第一行用于 ID,第二行用于名称
当 sheet 激活时,团队成员将从数据库中加载,包括 ID 和姓名。
当我想在团队中添加一个新成员时,流程如下:
- 在第一行手动写入要添加的成员的 ID
- sheet根据步骤1中输入的id从另一个sheet加载名称
对于第 2 步,有两种方法可以完成:
- 要么在第二行写一个公式,对于固定的大量单元格,根据第一行的id从另一个sheet中提取名称。
- 使用如下
vba
代码处理第一行的更改事件:
private sub Worksheet_change(ByVal target as Range)
if Not Application.Intersect(target.row, ActiveSheet.rows(1)) Is Nothing then
Insert new column 'It is important, without this the changes are not applicable
look for the name of the id ih the target cell and make changes
End If
第二个解决方案更动态,我更喜欢这种方式,但是我遇到了一个问题:在执行第 1 步(从数据库加载 ID)时也应用了这个子程序,使 vba
程序 运行没有尽头,因此阻塞了excel
问题是:
有什么方法可以区别于 vba
上的编程更改来处理用户更改?
提前致谢
您想确保由 VBA 引起的更改不会触发另一个 Worksheet_change
事件。无需检查原始事件是由人还是程序引起的。您需要做的就是防止无限循环。这是您每次使用Worksheet_change
事件时需要牢记的事情。
您可以通过在 Worksheet_change
事件开始时首先禁用事件,然后在结束时重新启用事件来实现。
Private sub Worksheet_change(ByVal target as Range)
Application.EnableEvents = False ' Disable events to prevent infinite loop
If Not Application.Intersect(target.row, ActiveSheet.rows(1)) Is Nothing then
Insert new column 'It is important, without this the changes are not applicable
look for the name of the id in the target cell and make changes
End If
Application.EnableEvents = True ' Re-enable events
End Sub
因此,每当有人更改 sheet 中的某些内容时,就会触发该事件。一旦事件开始,事件就会被禁用,从而防止 VBA 自行触发。在事件结束时,事件将重新启用,以便它可以响应另一个用户引起的更改。
希望你一切顺利
我有一个 sheet,其中有项目团队成员。它包含两行:第一行用于 ID,第二行用于名称
当 sheet 激活时,团队成员将从数据库中加载,包括 ID 和姓名。
当我想在团队中添加一个新成员时,流程如下:
- 在第一行手动写入要添加的成员的 ID
- sheet根据步骤1中输入的id从另一个sheet加载名称
对于第 2 步,有两种方法可以完成:
- 要么在第二行写一个公式,对于固定的大量单元格,根据第一行的id从另一个sheet中提取名称。
- 使用如下
vba
代码处理第一行的更改事件:
private sub Worksheet_change(ByVal target as Range)
if Not Application.Intersect(target.row, ActiveSheet.rows(1)) Is Nothing then
Insert new column 'It is important, without this the changes are not applicable
look for the name of the id ih the target cell and make changes
End If
第二个解决方案更动态,我更喜欢这种方式,但是我遇到了一个问题:在执行第 1 步(从数据库加载 ID)时也应用了这个子程序,使 vba
程序 运行没有尽头,因此阻塞了excel
问题是:
有什么方法可以区别于 vba
上的编程更改来处理用户更改?
提前致谢
您想确保由 VBA 引起的更改不会触发另一个 Worksheet_change
事件。无需检查原始事件是由人还是程序引起的。您需要做的就是防止无限循环。这是您每次使用Worksheet_change
事件时需要牢记的事情。
您可以通过在 Worksheet_change
事件开始时首先禁用事件,然后在结束时重新启用事件来实现。
Private sub Worksheet_change(ByVal target as Range)
Application.EnableEvents = False ' Disable events to prevent infinite loop
If Not Application.Intersect(target.row, ActiveSheet.rows(1)) Is Nothing then
Insert new column 'It is important, without this the changes are not applicable
look for the name of the id in the target cell and make changes
End If
Application.EnableEvents = True ' Re-enable events
End Sub
因此,每当有人更改 sheet 中的某些内容时,就会触发该事件。一旦事件开始,事件就会被禁用,从而防止 VBA 自行触发。在事件结束时,事件将重新启用,以便它可以响应另一个用户引起的更改。