如何在Excel中加速此vba代码

时间:2013-12-08 08:26:35

标签: excel-vba vba excel

我在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。 请帮我加快这个过程。

3 个答案:

答案 0 :(得分:3)

我同意@ BK201您也可以使用自动过滤器。这是另一种更快的方法。我说更快,因为它不显示/隐藏循环中的行。另外,您可以在Application.ScreenUpdating = falseApplication.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