Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 如何从工作表更改事件在模块内执行宏代码_Vba_Excel - Fatal编程技术网

Vba 如何从工作表更改事件在模块内执行宏代码

Vba 如何从工作表更改事件在模块内执行宏代码,vba,excel,Vba,Excel,我在工作簿的第1页上有一组原始数据。在表2中,我使用公式从表1中提取一些数据 使用我在模块1中创建和发布的宏,我希望隐藏不包含特定数据的任何行。我可以在需要时通过Run>Run Sub/Userform直接执行宏。它工作得很好 但是,我更希望它在需要通过后台的工作表更改事件进行更新时运行,无论何时对工作表1进行编辑。由于我正在对工作表1进行编辑,但希望更改执行工作表2上的宏,因此我理解工作表更改事件必须放置在“此工作表”中,而不是特定的工作表中 这是宏代码 Sub HideRows() Dim

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

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

但是,我更希望它在需要通过后台的工作表更改事件进行更新时运行,无论何时对工作表1进行编辑。由于我正在对工作表1进行编辑,但希望更改执行工作表2上的宏,因此我理解工作表更改事件必须放置在“此工作表”中,而不是特定的工作表中

这是宏代码

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
    的Col
    A
    中,则您的宏将针对
    Sheet1
    中的任何更改运行,从而使工作簿变慢

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

  • 另外,
    行(CStr(i)+:“+CStr(i))
    可以写成
    行(i)

  • 在Excel中处理行时,建议始终将它们声明为
    Long
    ,而不是
    Integer
    。Post
    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
    
    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