如何区分 excel vba 上的手动单元格更改和自动单元格更改

how to distinguish between manual cell change and automatic cell change on excel vba

希望你一切顺利

我有一个 sheet,其中有项目团队成员。它包含两行:第一行用于 ID,第二行用于名称

当 sheet 激活时,团队成员将从数据库中加载,包括 ID 和姓名。

当我想在团队中添加一个新成员时,流程如下:

  1. 在第一行手动写入要添加的成员的 ID
  2. sheet根据步骤1中输入的id从另一个sheet加载名称

对于第 2 步,有两种方法可以完成:

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 自行触发。在事件结束时,事件将重新启用,以便它可以响应另一个用户引起的更改。