Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.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
excel vba使excel速度减慢,当单击工作表上的任意位置时,会导致10秒的egg计时器延迟_Excel_Vba - Fatal编程技术网

excel vba使excel速度减慢,当单击工作表上的任意位置时,会导致10秒的egg计时器延迟

excel vba使excel速度减慢,当单击工作表上的任意位置时,会导致10秒的egg计时器延迟,excel,vba,Excel,Vba,我使用以下vba代码,我使用这些代码隐藏一组行和取消隐藏行,具体取决于单元格是否包含文本,它们会导致我的excel电子表格变慢且无响应,并导致egg计时器显示约10秒 如果我把代码取出来,它会加快速度,那么我可以对代码做些什么,让它们加快速度,而不会花那么长时间?也许有更好的方法来组织代码,但我对vba还不太熟悉,所以我不确定我需要做什么,如果有人能帮我,我将不胜感激。谢谢 我之所以使用“工作表更改”和“工作表选择更改”,是因为无论用户是否单击单元格,页面都会更新 Private Sub Wor

我使用以下vba代码,我使用这些代码隐藏一组行和取消隐藏行,具体取决于单元格是否包含文本,它们会导致我的excel电子表格变慢且无响应,并导致egg计时器显示约10秒

如果我把代码取出来,它会加快速度,那么我可以对代码做些什么,让它们加快速度,而不会花那么长时间?也许有更好的方法来组织代码,但我对vba还不太熟悉,所以我不确定我需要做什么,如果有人能帮我,我将不胜感激。谢谢

我之所以使用“工作表更改”和“工作表选择更改”,是因为无论用户是否单击单元格,页面都会更新

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
       If Range("K22").Value <> "" Then
    Application.ScreenUpdating = False
    Rows("25:38").EntireRow.Hidden = False
    Rows("40:48").EntireRow.Hidden = True
    ElseIf Range("K22").Value = "" Then
    Rows("25:38").EntireRow.Hidden = True
    Rows("40:48").EntireRow.Hidden = False
    End If
    Application.ScreenUpdating = True
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
       If Range("K22").Value <> "" Then
    Application.ScreenUpdating = False
    Rows("25:38").EntireRow.Hidden = False
    Rows("40:48").EntireRow.Hidden = True
    ElseIf Range("K22").Value = "" Then
    Rows("25:38").EntireRow.Hidden = True
    Rows("40:48").EntireRow.Hidden = False
    End If
    Application.ScreenUpdating = True
End Sub
Private子工作表\u selection更改(ByVal目标作为范围)
如果范围(“K22”)。值为“”,则
Application.ScreenUpdating=False
行(“25:38”).EntireRow.Hidden=False
行(“40:48”).EntireRow.Hidden=True
ElseIf范围(“K22”).Value=”“然后
行(“25:38”).EntireRow.Hidden=True
行(“40:48”).EntireRow.Hidden=False
如果结束
Application.ScreenUpdating=True
端接头
私有子工作表_更改(ByVal目标作为范围)
如果范围(“K22”)。值为“”,则
Application.ScreenUpdating=False
行(“25:38”).EntireRow.Hidden=False
行(“40:48”).EntireRow.Hidden=True
ElseIf范围(“K22”).Value=”“然后
行(“25:38”).EntireRow.Hidden=True
行(“40:48”).EntireRow.Hidden=False
如果结束
Application.ScreenUpdating=True
端接头

这对我来说立即生效:

Application.ScreenUpdating = False
Select Case Range("K22")
Case Is <> ""
    Rows("25:38").Hidden = False
    Rows("40:48").Hidden = True
Case Else
    Rows("25:38").Hidden = True
    Rows("40:48").Hidden = False
End Select
Application.ScreenUpdating = True
Application.ScreenUpdate=False
选择案例范围(“K22”)
案例为“”
行(“25:38”)。隐藏=假
行(“40:48”)。隐藏=真
其他情况
行(“25:38”)。隐藏=真
行(“40:48”)。隐藏=False
结束选择
Application.ScreenUpdating=True

主要问题来自工作表更改事件,但它可以应用于任何事件

每次隐藏列时都会触发工作表更改,因此它会多次尝试隐藏相同的列,直到(最终)因内存不足错误而失败:

隐藏这些列。。。哦,换工作表。。。隐藏这些列。。。哦,换工作表。。。隐藏

要避免这种情况,您需要使用

Application.EnableEvents = False
当您决定要进行更改时

Application.EnableEvents = True
完成后。
您可能还希望进行一些错误处理,以再次打开事件,就像发生了其他事件阻止代码运行一样,触发器将被关闭,电子表格将不再按预期进行更新

Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
Application.EnableEvents = False
If Range("K22").Value <> "" Then
    Rows("25:38").Hidden = False
    Rows("40:48").Hidden = True
Else
    Rows("25:38").Hidden = True
    Rows("40:48").Hidden = False
End If
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
Private子工作表\u更改(ByVal目标作为范围)
Application.ScreenUpdating=False
Application.EnableEvents=False
如果范围(“K22”)。值为“”,则
行(“25:38”)。隐藏=假
行(“40:48”)。隐藏=真
其他的
行(“25:38”)。隐藏=真
行(“40:48”)。隐藏=False
如果结束
Application.EnableEvents=True
Application.ScreenUpdating=True
端接头