【问题标题】:How to execute Macro code inside a module from a worksheet_change event如何从 worksheet_change 事件执行模块内的宏代码
【发布时间】:2015-12-09 19:11:08
【问题描述】:

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

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

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

这是宏代码

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

【问题讨论】:

  • 这不是和你的prev一样吗Question
  • 不是真的,那是关于隐藏/取消隐藏行所需的代码。这是关于如何执行的。虽然有一些重叠,但我没有在那个问题中发布任何代码。
  • 在您的 HideRows 宏中,完全限定单元格。例如Sheet2.Cells(i, 5).Value
  • 另外,Sheet 1 中发生的变化在哪里?哪个单元格或列?
  • 我已经发布了答案。您可能需要刷新页面才能看到它

标签: vba excel


【解决方案1】:

值得注意的几点

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

  2. 如果更改发生在 Col ASheet1 中,则捕获,否则您的宏将针对 Sheet1 中的任何更改运行,从而使您的工作簿变慢。

  3. 您不需要将宏保存在模块中。你可以把整个代码放在Sheet1中,如下图

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

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

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

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

【讨论】:

  • 谢谢。我已将此代码发布到工作表 1 的代码区域,但在相关单元格中看到 0,但该行没有被隐藏。我会检查以确保我没有做错什么。
  • 顺便说一句,您可以将If .Cells(i, 5).Value = 0 Then 更改为If .Cells(i, 5).Value = 0 And .Rows(i).EntireRow.Hidden = False Then
  • 感谢您的帮助。我创建了一个全新的工作表,但仍然无法隐藏相关行。不知道我做错了什么,但我会继续努力......
  • 好的,这样做...1确保代码粘贴在“Sheet1”代码区域2我希望您的工作表名称正确? 3 在 VBE 的即时窗口中,输入 Application.Enableevents=true
  • 很高兴能帮上忙 :) 您可能在其他宏中错误地将其关闭而忘记打开它。如果您认真考虑了我在上一个问题的第一条评论中提出的建议,那么您就不会遇到这个问题;)我在该评论中提供了一个链接供您阅读;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-06
相关资源
最近更新 更多