Vba 如何从工作表更改事件在模块内执行宏代码
我在工作簿的第1页上有一组原始数据。在表2中,我使用公式从表1中提取一些数据 使用我在模块1中创建和发布的宏,我希望隐藏不包含特定数据的任何行。我可以在需要时通过Run>Run Sub/Userform直接执行宏。它工作得很好 但是,我更希望它在需要通过后台的工作表更改事件进行更新时运行,无论何时对工作表1进行编辑。由于我正在对工作表1进行编辑,但希望更改执行工作表2上的宏,因此我理解工作表更改事件必须放置在“此工作表”中,而不是特定的工作表中 这是宏代码Vba 如何从工作表更改事件在模块内执行宏代码,vba,excel,Vba,Excel,我在工作簿的第1页上有一组原始数据。在表2中,我使用公式从表1中提取一些数据 使用我在模块1中创建和发布的宏,我希望隐藏不包含特定数据的任何行。我可以在需要时通过Run>Run Sub/Userform直接执行宏。它工作得很好 但是,我更希望它在需要通过后台的工作表更改事件进行更新时运行,无论何时对工作表1进行编辑。由于我正在对工作表1进行编辑,但希望更改执行工作表2上的宏,因此我理解工作表更改事件必须放置在“此工作表”中,而不是特定的工作表中 这是宏代码 Sub HideRows() Dim
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
对于如何使用工作表更改执行宏的任何帮助,我们将不胜感激。有几点值得注意
HideRows
宏时,即使您已对我使用了。工作表(“Sheet2”)
它仍然引用当前工作表,即Sheet1
。完全限定范围对象,如下所示。注意它们前面的点
Sheet1
的ColA
中,则您的宏将针对Sheet1
中的任何更改运行,从而使工作簿变慢Sheet1
,如下所示行(CStr(i)+:“+CStr(i))
可以写成行(i)
Long
,而不是Integer
。PostExcel2007
行数已增加,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
Private子工作表\u更改(ByVal目标作为范围)
暗我一样长,浅我一样长
“~~>正在检查列1中的更改
如果不相交(目标,列(1))为空,则
带工作表(“表2”)
lRow=.Range(“E”和.Rows.Count).End(xlUp).Row
对于i=1至lRow
如果.Cells(i,5).Value=0,则
.Rows(i).EntireRow.Hidden=True
ElseIf.Cells(i,5).Value 0和.Rows(i).EntireRow.Hidden=True然后
.Rows(i).EntireRow.Hidden=False
如果结束
接下来我
以
如果结束
端接头
这不是与上一个相同吗?不是,这是关于隐藏/取消隐藏行所需的代码。这是关于如何执行的。虽然有一些重叠,但我没有在这个问题上发布任何代码。在HideRows
宏中,完全限定单元格。例如Sheet2.单元格(i,5).Value
表1中的变化发生在哪里?哪个单元格或列?我已经发布了答案。您可能需要刷新页面才能看到它。我已将此代码发布到工作表1的代码区域,但在相关单元格中看到0,但该行未被隐藏。我将检查以确保我没有做错什么。顺便说一句,您可以将If.Cells(I,5).Value=0然后
更改为If.Cells(I,5).Value=0和.Rows(I).EntireRow.Hidden=False然后
谢谢您的帮助。我已经创建了一个全新的工作表,但仍然无法让它隐藏相关行。不确定我做错了什么,但我会继续尝试…好的,做这个<代码>1确保代码粘贴在“Sheet1”代码区2
希望您的图纸名称正确3
在VBE的即时窗口中,键入此应用程序。Enableevents=true
很高兴能为您提供帮助:)您可能在其他宏中错误地将其关闭,但忘记将其打开。如果你认真考虑我在你上一个问题的第一个评论中提出的建议,那么你就不会面临这个问题;)我给了你一个链接,让你在评论中阅读;)
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