我在Excel工作表中使用以下代码进行计算。不幸的是,它需要花费太多时间来计算并且页面会一直闪烁。
Private Sub Worksheet_Activate()
BeginRow = 1
EndRow = 300
ChkCol = 3
For RowCnt = BeginRow To EndRow
If Cells(RowCnt, ChkCol).Value = "B" Then
Cells(RowCnt, ChkCol).EntireRow.Hidden = True
Else
Cells(RowCnt, ChkCol).EntireRow.Hidden = False
End If
Next RowCnt
End Sub
用于考勤管理软件,有4张。我在除Sheet1
之外的所有工作表使用此代码。主数据输入sheet1
。
请帮我加快这个过程。
答案 0 :(得分:3)
我同意@ BK201您也可以使用自动过滤器。这是另一种更快的方法。我说更快,因为它不显示/隐藏循环中的行。另外,您可以在Application.ScreenUpdating = false
和Application.ScreenUpdating = true
之间使用代码来阻止闪烁,如@KazJaw所示。
Option Explicit
Private Sub Worksheet_Activate()
Dim BeginRow As Long, EndRow As Long
Dim ChkCol As Long, RowCnt As Long
Dim rngHide As Range
BeginRow = 1: EndRow = 300: ChkCol = 3
'~~> Unhide all the rows
Rows("1:300").EntireRow.Hidden = False
'~~> Loop through the rows and identify which rows needs to be hidden
For RowCnt = BeginRow To EndRow
If Cells(RowCnt, ChkCol).Value = "B" Then
If rngHide Is Nothing Then
Set rngHide = Rows(RowCnt)
Else
Set rngHide = Union(rngHide, Rows(RowCnt))
End If
End If
Next RowCnt
'~~> Hide the rows in one go
If Not rngHide Is Nothing Then rngHide.EntireRow.Hidden = True
End Sub
答案 1 :(得分:0)
我很快就看到了你的问题。似乎隐藏整行需要花费很多时间。因此,在隐藏行之前,您需要检查行是否已隐藏。或者已经显示您是否要取消隐藏它。我认为这段代码可以解决问题
Private Sub Worksheet_Activate()
BeginRow = 1
EndRow = 300
ChkCol = 3
For RowCnt = BeginRow To EndRow
If Cells(RowCnt, ChkCol).Value = "B" Then
If Cells(RowCnt, ChkCol).EntireRow.Hidden = False Then
Cells(RowCnt, ChkCol).EntireRow.Hidden = True
End If
Else
If Cells(RowCnt, ChkCol).EntireRow.Hidden = True Then
Cells(RowCnt, ChkCol).EntireRow.Hidden = False
End If
End If
Next RowCnt
End Sub
您的代码在我的计算机上也运行缓慢,但此代码对我有用。
答案 2 :(得分:0)
不断调用Excel很昂贵。将您需要检查的数据转储到变量数组中并进行处理要快得多。同样如上所述,您需要关闭屏幕更新,否则将进行左右计算,从而加速事情的发生。
以下是如何在您使用的上下文中使用变量数组(在C列中隐藏带有“B”的行,如果不是“B”则取消隐藏):
Sub improvedSpeed()
Application.ScreenUpdating = False
Dim varray() As Variant
Dim i As Long
varray() = Range("C1:C300").Value
For i = 1 To 300
If varray(i, 1) = "B" Then
Rows(i).Hidden = True
Else
Rows(i).Hidden = False
End If
Next
Application.ScreenUpdating = True
End Sub