插入公式后的宏延迟问题-Excel

插入公式后的宏延迟问题-Excel,excel,vba,excel-formula,latency,Excel,Vba,Excel Formula,Latency,我在Excel中有一个中央数据库,它使用在列B中输入的特定值,并根据该值隐藏/取消隐藏其他相关的列。这很好,直到我放入单独的公式,将不同的值复制到各自的表中 例如,如果在列B中输入A,则应列D:E。然后,一个单独的公式将行复制到一个单独的表,其中包含所有A的 问题是这个宏现在需要很长时间才能执行。我已经禁用了这些公式,让它们手动运行,但没有任何帮助。下面是隐藏/取消隐藏列的宏示例 Private Sub Worksheet_Change(ByVal Target As Range) I

我在
Excel
中有一个中央数据库,它使用在
列B
中输入的特定值,并根据该值隐藏/取消隐藏其他相关的
列。这很好,直到我放入单独的公式,将不同的值复制到各自的
表中

例如,如果在
列B
中输入
A
,则应
列D:E
。然后,一个单独的
公式将
复制到一个单独的
,其中包含所有
A的

问题是这个宏现在需要很长时间才能执行。我已经禁用了这些公式,让它们手动运行,但没有任何帮助。下面是隐藏/取消隐藏列的宏示例

Private Sub Worksheet_Change(ByVal Target As Range)

    If Not Intersect(Target, Range("B:B")) Is Nothing Then
        On Error GoTo safe_exit
        Application.EnableEvents = False
        Dim t As Range
        For Each t In Intersect(Target, Range("B:B"))
            Select Case (t.Value)
                Case "A"
                    Columns("B:BQ").EntireColumn.Hidden = False
                    Columns("H:AD").EntireColumn.Hidden = True
                    Columns("AF:BL").EntireColumn.Hidden = True
                    Columns("BQ").EntireColumn.Hidden = True
                Case "B"
                    Columns("B:BQ").EntireColumn.Hidden = False
                    Columns("F:G").EntireColumn.Hidden = True
                    Columns("P:BP").EntireColumn.Hidden = True
                    Columns("BQ").EntireColumn.Hidden = True
                Case "C"
                    Columns("B:BQ").EntireColumn.Hidden = False
                    Columns("F:O").EntireColumn.Hidden = True
                    Columns("T:BL").EntireColumn.Hidden = True
                    Columns("BQ").EntireColumn.Hidden = True
                Case "D"
                    Columns("B:BP").EntireColumn.Hidden = False
                    Columns("E:S").EntireColumn.Hidden = True
                    Columns("AB:BL").EntireColumn.Hidden = True
                    Columns("BN:BP").EntireColumn.Hidden = True
                    Columns("BQ").EntireColumn.Hidden = True
                Case "E"
                    Columns("B:BQ").EntireColumn.Hidden = False
                    Columns("D:AB").EntireColumn.Hidden = True
                    Columns("AF:BO").EntireColumn.Hidden = True
                Case "F"
                    Columns("B:BP").EntireColumn.Hidden = False
                    Columns("E:AE").EntireColumn.Hidden = True
                    Columns("AN:BN").EntireColumn.Hidden = True
                    Columns("BQ").EntireColumn.Hidden = True
                 Case "G"
                    Columns("B:BP").EntireColumn.Hidden = False
                    Columns("F:BJ").EntireColumn.Hidden = True
                    Columns("BL:BN").EntireColumn.Hidden = True
                    Columns("BQ").EntireColumn.Hidden = True
                 Case "H"
                    Columns("B:BP").EntireColumn.Hidden = False
                    Columns("F:BJ").EntireColumn.Hidden = True
                    Columns("BL:BN").EntireColumn.Hidden = True
                    Columns("BQ").EntireColumn.Hidden = True
                 Case "I"
                    Columns("B:BP").EntireColumn.Hidden = False
                    Columns("F:BN").EntireColumn.Hidden = True
                    Columns("BQ").EntireColumn.Hidden = True
                 Case "J"
                    Columns("B:BP").EntireColumn.Hidden = False
                    Columns("E:BN").EntireColumn.Hidden = True
                    Columns("BQ").EntireColumn.Hidden = True
                 Case "K"
                    Columns("B:BP").EntireColumn.Hidden = False
                    Columns("F:BN").EntireColumn.Hidden = True
                    Columns("BQ").EntireColumn.Hidden = True
                 Case "L"
                    Columns("B:BP").EntireColumn.Hidden = False
                    Columns("F:BN").EntireColumn.Hidden = True
                    Columns("BQ").EntireColumn.Hidden = True
                 Case "M"
                    Columns("B:BP").EntireColumn.Hidden = False
                    Columns("F:BN").EntireColumn.Hidden = True
                    Columns("BQ").EntireColumn.Hidden = True
                 Case "N"
                    Columns("B:BP").EntireColumn.Hidden = False
                    Columns("E:BN").EntireColumn.Hidden = True
                    Columns("BQ").EntireColumn.Hidden = True
                 Case "O"
                    Columns("B:BP").EntireColumn.Hidden = False
                    Columns("F:BJ").EntireColumn.Hidden = True
                    Columns("BM:BN").EntireColumn.Hidden = True
                    Columns("BQ").EntireColumn.Hidden = True
                 Case "P"
                    Columns("B:BP").EntireColumn.Hidden = False
                    Columns("F:AM").EntireColumn.Hidden = True
                    Columns("AO:BN").EntireColumn.Hidden = True
                    Columns("BQ").EntireColumn.Hidden = True
                 Case "Q"
                    Columns("B:BP").EntireColumn.Hidden = False
                    Columns("F:BL").EntireColumn.Hidden = True
                    Columns("BN").EntireColumn.Hidden = True
                    Columns("BQ").EntireColumn.Hidden = True
                 Case "R"
                    Columns("B:BP").EntireColumn.Hidden = False
                    Columns("F:AN").EntireColumn.Hidden = True
                    Columns("AP:BM").EntireColumn.Hidden = True
                    Columns("BQ").EntireColumn.Hidden = True
                 Case "S"
                    Columns("B:BP").EntireColumn.Hidden = False
                    Columns("F:AO").EntireColumn.Hidden = True
                    Columns("AQ:BM").EntireColumn.Hidden = True
                    Columns("BQ").EntireColumn.Hidden = True
                 Case "T"
                    Columns("B:BP").EntireColumn.Hidden = False
                    Columns("F:AN").EntireColumn.Hidden = True
                    Columns("AP:BM").EntireColumn.Hidden = True
                    Columns("BQ").EntireColumn.Hidden = True
                 Case "U"
                    Columns("B:BP").EntireColumn.Hidden = False
                    Columns("F:AP").EntireColumn.Hidden = True
                    Columns("BB:BN").EntireColumn.Hidden = True
                    Columns("BQ").EntireColumn.Hidden = True
                 Case "V"
                    Columns("B:BP").EntireColumn.Hidden = False
                    Columns("F:BA").EntireColumn.Hidden = True
                    Columns("BK:BN").EntireColumn.Hidden = True
                    Columns("BQ").EntireColumn.Hidden = True 
                    'do nothing
            End Select
        Next t
        ActiveWindow.Zoom = 100 '<<<
    End If

safe_exit:
    Application.EnableEvents = True

End Sub
数据库包含大约3000行。文件大小约为7-8MB。我已经删除了所有公式,但存在相同的延迟。我删除了2000行数据,这使它变得更快。但这似乎并不是一个很大的数目,使这么多的差异


该文件通过OneDrive与许多实时使用它的用户共享。一位用户后来提到他根本无法打开该文件。它一打开就崩溃了。这可能是巧合吗?断开的链接导致了腐败

请注意,您可以将代码减少为只有一个
相交(目标,范围(“B:B”))
,然后退出循环,改用
匹配功能。这样,您将只隐藏列一次,而不是每次受影响范围内出现值
a

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim AffectedRange As Range
    Set AffectedRange = Intersect(Target, Range("B:B")) 'intersect olny once and set into variable for re-use

    If Not AffectedRange Is Nothing Then
        On Error GoTo safe_exit
        Application.EnableEvents = False

        Dim FoundAt As Long
        On Error Resume Next
        FoundAt = Application.WorksheetFunction.Match("A", AffectedRange, False)
        On Error GoTo 0

        If FoundAt <> 0 Then
            Columns("B:BQ").EntireColumn.Hidden = False
            Columns("H:AD").EntireColumn.Hidden = True
            Columns("AF:BL").EntireColumn.Hidden = True
            Columns("BQ").EntireColumn.Hidden = True
        End If

        ActiveWindow.Zoom = 100 '<<<
    End If

safe_exit:
    Application.EnableEvents = True
End Sub
选项显式
私有子工作表_更改(ByVal目标作为范围)
变暗影响范围作为范围
Set AffectedRange=Intersect(目标,范围(“B:B”))“Intersect olny一次并设置为变量以供重用
如果不受影响,那么范围什么都不是
错误转到安全出口
Application.EnableEvents=False
长得一样
出错时继续下一步
FoundAt=Application.WorksheetFunction.Match(“A”,AffectedRange,False)
错误转到0
如果在0处找到,则
列(“B:BQ”).entireclumn.Hidden=False
列(“H:AD”).entireclumn.Hidden=True
列(“AF:BL”).entireclumn.Hidden=True
列(“BQ”).entireclumn.Hidden=True
如果结束

ActiveWindow.Zoom=100“您用于复制数据的公式是什么?@teylyn Updated如果您怀疑您的文件已损坏,我建议您尝试使用二进制格式
xlsb
,它会生成更小的文件,并且似乎比开放式XML格式
xlsm
稳定得多。值得一试(我个人在正常日常使用中遇到了许多大文件、
xlsm
和文件损坏的问题)。@JPA0888请测试如果您在本次事件中仅用这一行
MsgBox“I run”
替换完整代码会发生什么情况。那还慢吗?如果是,这意味着您的公式通常速度较慢,与代码本身无关。实际上,你对单元格所做的更改导致了公式的重新计算。因此,重新计算发生在VBA事件之前,这就是为什么它看起来很慢(但实际上只是公式慢)。@JPA0888您显示的公式是否依赖于具有公式的单元格?在这种情况下,这些公式可能是减速的问题。如果是,请在你的问题()中也显示它们。
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim AffectedRange As Range
    Set AffectedRange = Intersect(Target, Range("B:B")) 'intersect olny once and set into variable for re-use

    If Not AffectedRange Is Nothing Then
        On Error GoTo safe_exit
        Application.EnableEvents = False

        Dim FoundAt As Long
        On Error Resume Next
        FoundAt = Application.WorksheetFunction.Match("A", AffectedRange, False)
        On Error GoTo 0

        If FoundAt <> 0 Then
            Columns("B:BQ").EntireColumn.Hidden = False
            Columns("H:AD").EntireColumn.Hidden = True
            Columns("AF:BL").EntireColumn.Hidden = True
            Columns("BQ").EntireColumn.Hidden = True
        End If

        ActiveWindow.Zoom = 100 '<<<
    End If

safe_exit:
    Application.EnableEvents = True
End Sub