如何在Excel中加速此vb代码
我在Excel表格中使用以下代码进行计算。不幸的是,计算时间太长,页面一直在闪烁如何在Excel中加速此vb代码,excel,vba,Excel,Vba,我在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).EntireRo
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
之外的所有工作表。主数据输入到表1
。
请帮助我加快这个过程。我刚刚快速地研究了您的问题。隐藏一整排似乎要花很多时间。因此,在隐藏行之前,需要检查行是否尚未隐藏。或者已经显示,如果你想取消隐藏它。我认为这段代码可以解决这个问题
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
您的代码在我的计算机上运行速度也很慢,但此代码对我有效。我同意@BK201,您也可以使用自动筛选。这里有另一个更快的方法。我说更快是因为它不会在循环中显示/隐藏行。此外,您还可以在
Application.screenUpdate=false
和Application.screenUpdate=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
不断地调用Excel是很昂贵的。将您需要检查的数据转储到一个变体数组中,并且处理该数组的速度要快得多。同样如前所述,您需要关闭屏幕更新,否则计算将左右进行,从而加快速度 以下是如何在您正在使用的上下文中使用变量数组(在C列中隐藏带有“B”的行,如果不是“B”,则取消隐藏):
在开头添加
Application.screenUpdate=false
并在结尾添加`Application.screenUpdate=true
。为什么不使用Autofilter
?这甚至可以在不到一秒钟的时间内解决。虽然它不会对这里的时间产生太大影响,但这并不是说您要将变量声明为变量,也不是说您应该这么长。这种方法的成本太高。如果要循环,为什么要取消隐藏所有行?@isson:在Excel中一次性取消隐藏行并不昂贵(而且在开始时取消隐藏行只会减少下一次循环的压力。朋友,首先让我告诉你,我对VB方面非常熟悉。所以根据这个水平考虑我的知识。我在第2页、第3页和第4页中也使用了引用的代码…@Anesh:首先让我告诉你,我对VB方面非常熟悉。
那么这是一个了解代码功能并同时学习代码的绝佳机会;)朋友,首先让我告诉你,我在VB领域非常新鲜。所以只考虑我的知识。此外,我还使用了表2、表3和表4中引用的代码。这可能是导致该过程变慢的原因,请您指导我如何在一个代码中实现它,当我在表1中进行任何更改时,该代码应该可以工作。另外,请告诉我在哪里复制此代码
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