如何在Excel中加速此vb代码

如何在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

我在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
之外的所有工作表。主数据输入到
表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