加快 VBA 执行速度
Speed up VBA execution
所以我有下面的 VBA 宏设置,当 CompHide 运行时,它需要几分钟来更新。我觉得这是由于 C.EntireRow.Columns(43).Value = ""
这行
我尝试创建一个新的 "helper" 列来检查两列是否都是空的,然后将其设置为 return "Y" 或 "N" 然后使用宏查看 "Y" 并隐藏它们。这加快了速度,但如果可以的话,我想变得更快。
原代码:
Sub CompHide()
Dim sht As Worksheet, C As Range
Application.ScreenUpdating = False
Application.EnableEvents = False
Set sht = Sheets("Comparison")
sht.Rows.Hidden = False
CSetRowVis "C9", "CMarket1"
CSetRowVis "C115", "CMarket2"
CSetRowVis "C221", "CMarket3"
CSetRowVis "C329", "CMarket4"
CSetRowVis "C437", "CMarket5"
CSetRowVis "C545", "CMarket6"
CSetRowVis "C653", "CMarket7"
CSetRowVis "C761", "CMarket8"
CSetRowVis "C869", "CMarket9"
CSetRowVis "C977", "CMarket10"
For Each C In sht.Range("CNonTest")
If C.Value = "" And C.EntireRow.Columns(43).Value = "" Then
C.EntireRow.Hidden = True
End If
Next
sht.Range("CBlank").EntireRow.Hidden = True
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
Sub CSetRowVis(addr As String, rngName As String)
With Sheets("Comparison")
If .Range(addr).Value = "Unused" Then
.Range(rngName).EntireRow.Hidden = True
End If
End With
End Sub
新代码:
Sub CompHide()
Dim sht As Worksheet, C As Range
Application.ScreenUpdating = False
Application.EnableEvents = False
Set sht = Sheets("Comparison")
sht.Rows.Hidden = False
CSetRowVis "C9", "CMarket1"
CSetRowVis "C115", "CMarket2"
CSetRowVis "C221", "CMarket3"
CSetRowVis "C329", "CMarket4"
CSetRowVis "C437", "CMarket5"
CSetRowVis "C545", "CMarket6"
CSetRowVis "C653", "CMarket7"
CSetRowVis "C761", "CMarket8"
CSetRowVis "C869", "CMarket9"
CSetRowVis "C977", "CMarket10"
For Each C In sht.Range("CHideTest")
If C.Value = "Y" Then
C.EntireRow.Hidden = True
End If
Next
sht.Range("CBlank").EntireRow.Hidden = True
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
Sub CSetRowVis(addr As String, rngName As String)
With Sheets("Comparison")
If .Range(addr).Value = "Unused" Then
.Range(rngName).EntireRow.Hidden = True
End If
End With
End Sub
这是使用 Excel 2013 标准 64 位。行数不到 1200。列数为 150。所有这些单元格都是公式
如果您需要任何额外信息,请告诉我。
而不是这个:
For Each C In sht.Range("CHideTest")
If C.Value = "Y" Then
C.EntireRow.Hidden = True
End If
Next
考虑这样的事情:
Dim rng As Range 'for collecting rows to be hidden
For Each C In sht.Range("CHideTest")
If C.Value = "Y" Then
if rng Is Nothing Then
set rng = C
Else
set rng = application.union(rng, C)
end if
End If
Next
'hide all accumulated rows (if any found)
if not rng is nothing then rng.EntireRow.Hidden = True
所以我有下面的 VBA 宏设置,当 CompHide 运行时,它需要几分钟来更新。我觉得这是由于 C.EntireRow.Columns(43).Value = ""
这行我尝试创建一个新的 "helper" 列来检查两列是否都是空的,然后将其设置为 return "Y" 或 "N" 然后使用宏查看 "Y" 并隐藏它们。这加快了速度,但如果可以的话,我想变得更快。
原代码:
Sub CompHide()
Dim sht As Worksheet, C As Range
Application.ScreenUpdating = False
Application.EnableEvents = False
Set sht = Sheets("Comparison")
sht.Rows.Hidden = False
CSetRowVis "C9", "CMarket1"
CSetRowVis "C115", "CMarket2"
CSetRowVis "C221", "CMarket3"
CSetRowVis "C329", "CMarket4"
CSetRowVis "C437", "CMarket5"
CSetRowVis "C545", "CMarket6"
CSetRowVis "C653", "CMarket7"
CSetRowVis "C761", "CMarket8"
CSetRowVis "C869", "CMarket9"
CSetRowVis "C977", "CMarket10"
For Each C In sht.Range("CNonTest")
If C.Value = "" And C.EntireRow.Columns(43).Value = "" Then
C.EntireRow.Hidden = True
End If
Next
sht.Range("CBlank").EntireRow.Hidden = True
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
Sub CSetRowVis(addr As String, rngName As String)
With Sheets("Comparison")
If .Range(addr).Value = "Unused" Then
.Range(rngName).EntireRow.Hidden = True
End If
End With
End Sub
新代码:
Sub CompHide()
Dim sht As Worksheet, C As Range
Application.ScreenUpdating = False
Application.EnableEvents = False
Set sht = Sheets("Comparison")
sht.Rows.Hidden = False
CSetRowVis "C9", "CMarket1"
CSetRowVis "C115", "CMarket2"
CSetRowVis "C221", "CMarket3"
CSetRowVis "C329", "CMarket4"
CSetRowVis "C437", "CMarket5"
CSetRowVis "C545", "CMarket6"
CSetRowVis "C653", "CMarket7"
CSetRowVis "C761", "CMarket8"
CSetRowVis "C869", "CMarket9"
CSetRowVis "C977", "CMarket10"
For Each C In sht.Range("CHideTest")
If C.Value = "Y" Then
C.EntireRow.Hidden = True
End If
Next
sht.Range("CBlank").EntireRow.Hidden = True
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
Sub CSetRowVis(addr As String, rngName As String)
With Sheets("Comparison")
If .Range(addr).Value = "Unused" Then
.Range(rngName).EntireRow.Hidden = True
End If
End With
End Sub
这是使用 Excel 2013 标准 64 位。行数不到 1200。列数为 150。所有这些单元格都是公式
如果您需要任何额外信息,请告诉我。
而不是这个:
For Each C In sht.Range("CHideTest")
If C.Value = "Y" Then
C.EntireRow.Hidden = True
End If
Next
考虑这样的事情:
Dim rng As Range 'for collecting rows to be hidden
For Each C In sht.Range("CHideTest")
If C.Value = "Y" Then
if rng Is Nothing Then
set rng = C
Else
set rng = application.union(rng, C)
end if
End If
Next
'hide all accumulated rows (if any found)
if not rng is nothing then rng.EntireRow.Hidden = True