Excel 可变模块
当我在B2:B10中更改avalue时,需要显示消息“update” 运行Insert_row时,不应给出该消息。 代码可以工作,但是当我将过程Insert_行放在另一个模块中时,公共变量未知? 我怎样才能解决这个问题Excel 可变模块,excel,vba,object,module,scope,Excel,Vba,Object,Module,Scope,当我在B2:B10中更改avalue时,需要显示消息“update” 运行Insert_row时,不应给出该消息。 代码可以工作,但是当我将过程Insert_行放在另一个模块中时,公共变量未知? 我怎样才能解决这个问题 Public blockchange As Boolean Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Range("B2:B10")) Is N
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)如果您坚持,您可以在工作表的代码中也包含一个全局变量。在这种情况下,您可以通过将工作表的代码名作为前缀来访问它,例如
Sheet1.blockchange
。工作表的代码名是工作表的内部名称,您可以在项目窗口的VBA编辑器中看到它,或者如果打开属性窗口(F4),它将在第一行显示为(名称)
。如果重命名图纸,此名称不会更改,只能在VBA编辑器中更改
(3)对于您的特定情况,最好不要使用变量,而只是防止在运行
插入-代码时触发事件。您可以使用语句Application.EnableEvents=False
执行此操作。只是别忘了在代码末尾加上Application.EnableEvents=True
,可能有一个错误处理程序来防止在发生错误时语句不执行。在普通模块中声明它。或者在过程中使用例如Sheet1.blockchange
。是的,这是一个更好的解决方案。