我有一个超过200,000行的数据库。当我编写VBA脚本时,我有一个大约20,000行的数据库,所以我不关心数据库是否被过滤,因为VBA脚本运行得很快。因此,如果认识到数据库庞大并且正在测试VBA脚本,我会惊讶地发现它的运行速度有多慢。所以没有进一步说这是我的代码的样子:
Set wsDB = ThisWorkbook.Sheets("DB")
Dim nameIndex As Long: nameIndex = Application.Match(name, wsDB.Rows(1), 0)
Dim formula As String
formula = "=IFERROR(AVERAGEIFS(" + GRA(nameIndex) + "," + GRA(dateIndex) + ",R2C," + GRA(cellNameIndex) + ",RC1" + "),"""")"
其中GRA是一个返回列范围地址的函数。
Private Function GRA(ByRef rngIndex As Long)
GRA = "DB!" + CStr(Range(Cells(2, rngIndex), Cells(rowNos, rngIndex)).Address(1, 1, xlR1C1, 0, 0))
End Function
因此,我现在预先过滤表格,如何调整我的代码,以便它忽略所有隐藏的行,并仅考虑可见的内容。当然我知道一个简单的脏解决方案就是简单地复制过滤器数据库并将其粘贴到新的工作表中,但这会影响性能,而这正是我试图改进的。
答案 0 :(得分:0)
您可以使用以下函数返回一系列仅可见的单元格。
Function VisibleCells(Rng As Range) As Variant
Dim R As Range
Dim Arr() As Integer
Dim RNdx As Long
Dim CNdx As Long
If Rng.Areas.Count > 1 Then
VisibleCells = CVErr(xlErrRef)
Exit Function
End If
ReDim Arr(1 To Rng.Rows.Count, 1 To Rng.Columns.Count)
For RNdx = 1 To Rng.Rows.Count
For CNdx = 1 To Rng.Columns.Count
Set R = Rng(RNdx, CNdx)
If (R.EntireRow.Hidden = True) Or _
(R.EntireColumn.Hidden = True) Then
Arr(RNdx, CNdx) = 0
Else
Arr(RNdx, CNdx) = 1
End If
Next CNdx
Next RNdx
VisibleCells = Arr
End Function
以上代码来自http://www.cpearson.com/excel/VisibleCells.aspx。
通常情况下,我只会发布我编写的代码,但这完全符合我的想法。