我的工作簿第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执行宏的帮助都将不胜感激。
答案 0 :(得分:2)
值得注意的几点
问题是您没有完全限定单元格,所以当调用HideRows
宏时,即使您使用了With Me.Worksheets("Sheet2")
,它仍然指的是当前表单Sheet1
{1}}。完全限定您的范围对象,如下所示。注意它们之前的Dots
?
如果更改发生在A
的Col Sheet1
中,那么陷阱其他人将运行Sheet1
中的任何更改,从而使您的工作簿变慢。
您无需将宏保留在模块中。您可以将整个代码放在Sheet1
中,如下所示
Rows(CStr(i) + ":" + CStr(i))
也可以写为Rows(i)
在Excel中处理行时,建议将它们声明为Long
而不是Integer
。发布Excel2007
行数已增加,Integer
变量可能无法容纳该行。
这是你在尝试什么?将此代码放在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