Как мне сделать этот VBA быстрее, удаляет пустые ячейки

Этот массив VBA работает и удаляет все пробелы, которые я хочу. Но он распространяется вплоть до миллионной строки, занимая ценные ресурсы компьютера. Мне нужно либо сделать остановку VBA, если "следующие 10 строк в массиве не заполнены данными" ИЛИ Мне просто нужно, чтобы он остановился на строке 2000. Он сканирует I1:K2000 и данные отображаются в M1:O2000.

Function NonBlanks(DataRange As Variant) As Variant

Dim i As Long, J As Long, NumRows As Long, NumCols As Long, RtnA() As Variant
Dim RtnRow As Long

Application.ScreenUpdating = 0
If TypeName(DataRange) = "Range" Then DataRange = DataRange.Value2

NumRows = UBound(DataRange)
NumCols = UBound(DataRange, 2)

ReDim RtnA(1 To NumRows, 1 To NumCols)

For i = 1 To NumRows
If DataRange(i, 1) <> "" Then
RtnRow = RtnRow + 1
For J = 1 To NumCols
If DataRange(i, J) <> "" Then RtnA(RtnRow, J) = DataRange(i, J) _
Else RtnA(RtnRow, J) = ""
Next J
  End If
Next i

For i = RtnRow + 1 To NumRows
For J = 1 To NumCols
RtnA(i, J) = ""
Next J
Next i

NonBlanks = RtnA
Application.ScreenUpdating = 1
End Function

1 ответ

Если предположить, DataRange является действительным Range объект, вы можете очень быстро ограничить размер диапазона с помощью

Set DataRange = Intersect(DataRange.Parent.UsedRange, DataRange)

Прикрепите это вверху, прежде чем делать If TypeName... немного.

Parent из Range это Worksheet объект. Worksheet поддерживает свойство под названием UsedRange который включает в себя все ячейки, которые имеют данные или форматирование или каким-то образом отличаются от пустой ячейки по умолчанию. Это лучше, чем идти из угла в угол на всем листе.

Другие вопросы по тегам