如何从worksheet_change事件

时间:2015-09-13 19:29:31

标签: excel vba excel-vba

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

使用我在模块1中创建并发布的宏我想隐藏任何不包含特定数据的行。我需要通过Run> Run Sub / Userform直接执行宏。它运作得很好。

但是,每当对工作表1进行编辑时,我都希望在需要通过后台的worksheet_change事件进行更新时运行。因为我在工作表1上进行编辑但希望更改在工作表上执行宏2我理解workheet_change事件必须放在“This Worksheet”中,而不是特定的工作表。

这是宏代码

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执行宏的帮助都将不胜感激。

1 个答案:

答案 0 :(得分:2)

值得注意的几点

  1. 问题是您没有完全限定单元格,所以当调用HideRows宏时,即使您使用了With Me.Worksheets("Sheet2"),它仍然指的是当前表单Sheet1 {1}}。完全限定您的范围对象,如下所示。注意它们之前的Dots

  2. 如果更改发生在A的Col Sheet1中,那么陷阱其他人将运行Sheet1中的任何更改,从而使您的工作簿变慢。

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

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

  5. 在Excel中处理行时,建议将它们声明为Long而不是Integer。发布Excel2007行数已增加,Integer变量可能无法容纳该行。

  6. 这是你在尝试什么?将此代码放在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