有一些什麼限制,我可以在通過VBA的範圍內選擇?基本上我發現的是,如果我是隱藏整個行,而在一個循環時,會如果有大量的行隱藏的相當長一段時間。範圍限制的難題
前) - 隱藏不具有在列值的任何行A
For i = 1 to 600
With Range("A" & i)
If .value = vbEmpty then .EntireRow.Hidden = True
End With
Next
這樣做的更快捷的方法是使每個引用這些行的一個範圍,然後做一個單「.entirerow.hidden = true」語句。是的,我已經有了application.screenupdating = false設置。
我現在遇到的問題是,如果該範圍的字符串引用太長,它只是失敗。
下面的代碼聲明它接受行號的一個標準數組(如果該數組手之前進行),以及參數的參數(如果你不想手之前聲明數組的功能,並且行的列表很小)。然後它創建一個在範圍參考中使用的字符串。
Function GetRows(argsArray() As Long, ParamArray args() As Variant) As Range
Dim rngs As String
Dim r
For Each r In argsArray
rngs = rngs & "," & r & ":" & r
Next
For Each r In args
rngs = rngs & "," & r & ":" & r
Next
rngs = Right(rngs, Len(rngs) - 1)
Set GetRows = Range(rngs)
End Function
Function dfdfd()
Dim selList(50) As Long, j As Long
For i = 1 To 100
If i Mod 2 = 1 Then
selList(j) = i
j = j + 1
End If
Next
selList(50) = 101
GetRows(selList).Select
End Function
第二個函數「dfdfd」只是用來舉例說明它何時失敗。要查看它的工作時間,只需創建一個包含5個條目的新數組,然後嘗試。有用。 (?)
最後更新:
Option Explicit
Public Sub test()
Dim i As Integer
Dim t As Long
Dim nRng As Range
t = Timer()
Application.ScreenUpdating = False
Set nRng = [A1]
For i = 1 To 6000
Set nRng = Union(nRng, Range("A" & i))
Next
nRng.RowHeight = 0
'nRng.EntireRow.Hidden = true
Application.ScreenUpdating = True
Debug.Print "Union (RowHeight): " & Timer() - t & " seconds"
'Debug.Print "Union (EntireRow.Hidden): " & Timer() - t & " seconds"
End Sub
結果:
聯盟(行高:0.109375秒
聯盟(隱行):0.625秒
完美!謝謝一堆。 – JakeTheSnake 2009-11-02 21:03:55