Проблема с задержкой макросов после вставки формул - Excel - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть центральная база данных в Excel, которая использует определенные значения, введенные в Column B, и скрывает / отображает другие релевантные Columns на основе этого значения.Это работало нормально, пока я не вставил отдельные формулы, которые копируют разные значения в соответствующие sheets.

Например, если A было введено в Column B, оно должно было бы Columns D:E.Затем отдельный formula скопировал бы row в отдельный sheet, который содержал все A's.

Проблема в том, что этот макрос теперь занимает много времени.Я отключил формулы, чтобы они запускались вручную, но это не помогает.Вот пример макроса, который скрывает / показывает столбцы.

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

Это формула:

=IF(IFERROR(INDEX('XXXXX'!B$5:B$9963,MATCH($A5,'XXXXX'!$A$5:$A$9963,0)),"")="","",INDEX('XXXXX'!B$5:B$9963,MATCH($A5,'XXXXX'!$A$5:$A$9963,0)))

База данных содержит около 3000 строк.Размер файла составляет около 7-8 МБ.Я удалил все формулы, но такая же задержка существует.Я удалил 2000 строк данных, и это сделало это быстрее.Но это не так уж важно, чтобы что-то изменить?

Файл предоставляется через OneDrive многочисленным пользователям, использующим его в режиме реального времени.С тех пор пользователь упомянул, что не может открыть файл вообще.Вылетает при открытии.Может ли это быть совпадением, а неработающая связь порождает коррупцию?

1 Ответ

0 голосов
/ 19 февраля 2019

Обратите внимание, что вы можете уменьшить свой код только до одного Intersect(Target, Range("B:B")), отключить цикл и использовать вместо него функцию Match.Таким образом, вы будете скрывать столбец только один раз, а не каждый раз, когда значение 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
...