如何从worksheet_change事件中执行模块内的macros代码

我在工作簿的工作表1上有一组原始数据。 在工作表2上,我使用公式从工作表1中提取部分数据。

使用我在模块1中创build和发布的macros我想隐藏任何不包含特定数据的行。 我能够直接执行macros,当我需要通过运行>运行子/用户窗体。 它完美的作品。

但是,我希望它运行,当需要更新通过在后台工作表change_change事件每当编辑表1。因为我正在编辑表1,但希望更改来执行表2macros我知道工作表change事件必须被放置在“This Worksheet”而不是特定工作表中。

这是macros代码

Sub HideRows() Dim i As Integer i = 1 Do While Not Cells(i, 5) = "" If Cells(i, 5).Value = 0 Then Rows(CStr(i) + ":" + CStr(i)).EntireRow.Hidden = True ElseIf Cells(i, 5).Value <> 0 And Rows(CStr(i) + ":" + CStr(i)).EntireRow.Hidden = True Then Rows(CStr(i) + ":" + CStr(i)).EntireRow.Hidden = False End If i = i + 1 Loop End Sub 

直接运行上面的代码做我需要的。 我正在使用下面的代码来执行此通过worksheet_change事件不起作用。

 Private Sub Worksheet_Change(ByVal Target As Range) With Me.Worksheets("Sheet2") Call HideRows End With End Sub 

任何帮助如何使用worksheet_change执行macros将不胜感激。

几点值得注意

  1. 问题是,即使您已经使用With Me.Worksheets("Sheet2")With Me.Worksheets("Sheet2")您调用HideRowsmacros时,您还没有完全限定单元格,但它仍然指的是Sheet1的当前表单。 完全限定您的范围对象,如下所示。 注意他们之前的Dots吗?

  2. 如果更改发生在Sheet1 A ,那么将会陷阱,否则您的macros将运行Sheet1任何更改,从而使您的工作簿变慢。

  3. 您不需要将macros保留在模块中。 您可以将整个代码放在Sheet1 ,如下所示

  4. 也可以将Rows(CStr(i) + ":" + CStr(i))写为Rows(i)

  5. 在Excel中使用行时,最好将它们声明为Long而不是Integer 。 发布Excel2007 ,行数增加, Integervariables可能无法适应。

这是你正在尝试? 将此代码放在Sheet1 Sheet代码区域Sheet1

 Private Sub Worksheet_Change(ByVal Target As Range) Dim i As Long, lRow As Long '~~> Check of the change is happening in Col 1 If Not Intersect(Target, Columns(1)) Is Nothing Then With Worksheets("Sheet2") lRow = .Range("E" & .Rows.Count).End(xlUp).Row For i = 1 To lRow If .Cells(i, 5).Value = 0 Then .Rows(i).EntireRow.Hidden = True ElseIf .Cells(i, 5).Value <> 0 And .Rows(i).EntireRow.Hidden = True Then .Rows(i).EntireRow.Hidden = False End If Next i End With End If End Sub