Есть ли предел тому, что я могу выбрать в диапазоне через VBA? В основном, я обнаружил, что если я должен скрыть целую строку, находясь в цикле, это займет довольно много времени, если есть много строк, которые нужно скрыть.Ограничение по диапазону
ех) - Скрыть любую строку, которая не имеет значения в колонке А
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 set.
Проблема, с которой я сталкиваюсь, заключается в том, что если ссылка на строку для диапазона слишком длинная, она просто терпит неудачу.
Следующий код объявляет функцию, которая принимает как стандартный массив номеров строк (в случае, если массив сделан перед рукой), так и аргументы параметров (в случае, если вы не хотите объявлять массив перед началом работы, и список строк мал). Затем он создает строку, которая используется в ссылке диапазона.
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» используется только для примера, когда она терпит неудачу. Чтобы увидеть, когда это работает, просто создайте новый массив с say-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
Результаты:
Union (высота строки: 0.109375 секунд
Union (скрытый ряд): 0.625 секунды
Отлично! Огромное спасибо. – JakeTheSnake