【问题标题】:Excel VBA Execute on non active Cell ChangeExcel VBA 在非活动单元格更改上执行
【发布时间】:2015-10-14 07:45:43
【问题描述】:

大家好,我有一些代码希望在单元格更改其值时自动执行。

我有 2 个工作表(工作表和摘要)。您在工作表中输入信息,它会计算汇总表中的值。如果摘要表上单元格的值发生更改,我希望我的代码执行。注意:摘要表的单元格永远不会主动更改,这意味着不允许任何人单击摘要表上的单元格并更改某些内容。

我将它设置为 Worksheet_Change(...) 但它不起作用,如果我将它设置为像 HideRows() 这样的自命名函数,然后手动运行它,它就可以正常工作。

那么,如果摘要上的单元格发生更改,我怎样才能让代码自动执行?

代码如下:

Private Sub Worksheet_Change(ByVal Target As Range)

Dim rng As Range
Dim cell As Range
Set rng = Sheets("Summary").Range("G10:P10")

Sheets("Summary").Range("11:19, 23:31, 43:51, 54:62, 78:86, 90:98").EntireRow.Hidden = True

For Each cell In rng

    If cell >= 2000 And cell < 4000 Then
        Sheets("Summary").Range("11:11, 23:23, 43:43, 54:54, 78:78, 90:90").EntireRow.Hidden = False
        Sheets("Summary").Range("12:19, 24:31, 44:51, 55:62, 79:86, 91:98").EntireRow.Hidden = True
    End If

    If cell.Value >= 4000 And cell.Value < 6000 Then
        Sheets("Summary").Range("11:12, 23:24, 43:44, 54:55, 78:79, 90:91").EntireRow.Hidden = False
        Sheets("Summary").Range("13:19, 25:31, 45:51, 56:62, 80:86, 92:98").EntireRow.Hidden = True
    End If

    If cell.Value >= 6000 And cell.Value < 8000 Then
        Sheets("Summary").Range("11:13, 23:25, 43:45, 54:56, 78:80, 90:92").EntireRow.Hidden = False
        Sheets("Summary").Range("14:19, 26:31, 46:51, 57:62, 81:86, 93:98").EntireRow.Hidden = True
    End If

    If cell.Value >= 8000 And cell.Value < 10000 Then
        Sheets("Summary").Range("11:14, 23:26, 43:46, 54:57, 78:81, 90:93").EntireRow.Hidden = False
        Sheets("Summary").Range("15:19, 27:31, 47:51, 58:62, 82:86, 94:98").EntireRow.Hidden = True
    End If

    If cell.Value >= 10000 And cell.Value < 12000 Then
        Sheets("Summary").Range("11:15, 23:27, 43:47, 54:58, 78:82, 90:94").EntireRow.Hidden = False
        Sheets("Summary").Range("16:19, 28:31, 48:51, 59:62, 83:86, 95:98").EntireRow.Hidden = True
    End If

    If cell.Value >= 12000 And cell.Value < 14000 Then
        Sheets("Summary").Range("11:16, 23:28, 43:48, 54:59, 78:83, 90:95").EntireRow.Hidden = False
        Sheets("Summary").Range("17:19, 29:31, 49:51, 60:62, 84:86, 96:98").EntireRow.Hidden = True
    End If

    If cell.Value >= 14000 And cell.Value < 16000 Then
        Sheets("Summary").Range("11:17, 23:29, 43:49, 54:60, 78:84, 90:96").EntireRow.Hidden = False
        Sheets("Summary").Range("18:19, 30:31, 50:51, 61:62, 85:86, 97:98").EntireRow.Hidden = True
    End If

    If cell.Value >= 16000 And cell.Value < 18000 Then
        Sheets("Summary").Range("11:18, 23:30, 43:50, 54:61, 78:85, 90:97").EntireRow.Hidden = False
        Sheets("Summary").Range("19:19, 31:31, 51:51, 62:62, 86:86, 98:98").EntireRow.Hidden = True
    End If

    If cell.Value >= 18000 And cell.Value < 20000 Then
        Sheets("Summary").Range("11:19, 23:31, 43:51, 54:62, 78:86, 90:98").EntireRow.Hidden = False
    End If
Next
End Sub

【问题讨论】:

    标签: excel vba execute


    【解决方案1】:

    如果我正确理解您的问题,请尝试使用 Worksheet_Calculate 例程 - 当摘要表中的值(公式)发生更改时应该运行该例程。

    希望这就是你要问的。

    【讨论】:

    • 我将其更改为计算,但出现错误:运行时错误-2147417848(80010108):对象“范围”的“隐藏”方法失败,它指向表格(“摘要”)。范围("11:19, 23:31, 43:51, 54:62, 78:86, 90:98").EntireRow.Hidden = True line。
    • 我不确定,也没有打开 Excel 进行检查,但这可能与它在工作表中进行更改时尝试重新运行循环有关- 尝试在代码顶部添加 Application.EnableEvents = False 并在底部添加 Application.EnableEvents = True - 它会阻止它重新输入,直到您完成更改...
    • :) 很高兴它成功了!!! - 记得将答案标记为解决方案,然后欢迎来到 SO!
    【解决方案2】:

    如何将它保存在 HideRows() 中并从 worksheet_change 中调用它..

    Private Sub Worksheet_Change(ByVal Target As Range)
    
      HideRows() 
    
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-07
      相关资源
      最近更新 更多