vba 应付变量模块

vba cope variable module

当我更改 B2:B10 中的值时需要消息“更新” 当 运行 Insert_row 它不应该给出那个消息。 代码有效,但是当我将过程 Insert_row 放在另一个模块中时,public 变量未知? 我该如何解决这个问题。

Public blockchange As Boolean

Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(Target, Range("B2:B10")) Is Nothing And blockchange = False Then
MsgBox "Update"
End If

End Sub

Sub Insert_rows()

blockchange = True
Dim LastRow As Integer

LastRow = 3 * ActiveSheet.UsedRange.Rows.Count
For i = 3 To LastRow Step 3
    Cells(i, 1).EntireRow.Insert
    Cells(i, 1).EntireRow.Insert
   
Next i
blockchange = False
End Sub

一些想法:
(1) 正如 SJR 所写,将全局变量放入常规模块中。

(2) 如果你坚持,你可以在sheet的代码中也有一个全局变量。在这种情况下,您可以通过将 sheet 的 codename 作为前缀来访问它,例如 Sheet1.blockchange。一个sheet的codename是一个sheet的内部名称,你在项目window的VBA编辑器里看或者,如果您打开 属性 window (F4),它会在第一行显示为 (name)。如果重命名 sheet,此名称不会更改,您只能在 VBA 编辑器中更改它。

(3) 对于您的特定情况,最好不要使用变量,而只是为了防止事件在 Insert 代码为 运行。您可以使用语句 Application.EnableEvents = False 执行此操作。只是不要忘记将 Application.EnableEvents = True 放在代码的末尾,可能带有错误处理程序以防止发生错误时不执行该语句。