插入公式后的宏延迟问题 - Excel
Macro latency issue after inserting formulas - Excel
我在 Excel
中有一个中央数据库,它使用输入到 Column B
和 hides/unhides 其他相关 Columns
中的特定值。在我放入单独的公式将不同的值复制到它们各自的 sheets
之前,这工作得很好。
例如如果 A
在 Column B
中输入,它应该 Columns D:E
。然后,一个单独的 formula
会将 row
复制到一个单独的 sheet
中,其中包含所有 A's
.
问题是这个宏现在需要很长时间才能执行。我已经禁用了手动使它们 运行 的公式,但它没有帮助。这是 hides/unhides 列的宏示例。
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:B63,MATCH($A5,'XXXXX'!$A:$A63,0)),"")="","",INDEX('XXXXX'!B:B63,MATCH($A5,'XXXXX'!$A:$A63,0)))
数据库包含大约 3000 行。文件大小约为 7-8MB。我删除了所有公式,但存在相同的延迟。我删除了 2000 行数据,这使它更快。但这似乎并没有很大的不同?
该文件通过 OneDrive 与众多实时使用它的用户共享。此后,一位用户提到他根本无法打开该文件。一打开就崩溃。会不会是巧合,损坏的 link 导致了损坏?
请注意,您可以将代码减少到只有一个 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
我在 Excel
中有一个中央数据库,它使用输入到 Column B
和 hides/unhides 其他相关 Columns
中的特定值。在我放入单独的公式将不同的值复制到它们各自的 sheets
之前,这工作得很好。
例如如果 A
在 Column B
中输入,它应该 Columns D:E
。然后,一个单独的 formula
会将 row
复制到一个单独的 sheet
中,其中包含所有 A's
.
问题是这个宏现在需要很长时间才能执行。我已经禁用了手动使它们 运行 的公式,但它没有帮助。这是 hides/unhides 列的宏示例。
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:B63,MATCH($A5,'XXXXX'!$A:$A63,0)),"")="","",INDEX('XXXXX'!B:B63,MATCH($A5,'XXXXX'!$A:$A63,0)))
数据库包含大约 3000 行。文件大小约为 7-8MB。我删除了所有公式,但存在相同的延迟。我删除了 2000 行数据,这使它更快。但这似乎并没有很大的不同?
该文件通过 OneDrive 与众多实时使用它的用户共享。此后,一位用户提到他根本无法打开该文件。一打开就崩溃。会不会是巧合,损坏的 link 导致了损坏?
请注意,您可以将代码减少到只有一个 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