Todd,
Лучшее решение, которое я мог придумать, - это сбросить вершины в диапазон, а затем сбросить эти значения диапазона в массив вариантов. Как вы сказали, «For Next» (для 10000 ячеек в моем тесте) заняло несколько секунд. Поэтому я создал функцию, которая возвращает верх ячейки, в которую она была введена.
Приведенный ниже код в основном представляет собой функцию, которая копирует использованный диапазон листа, который вы передаете ему, и затем вводит описанную выше функцию в каждую ячейку используемого диапазона скопированного листа. Затем он транспонирует и сбрасывает этот диапазон в массив вариантов.
Это займет всего секунду или около того для 10000 клеток. Не знаю, полезно ли это, но это был интересный вопрос. Если это полезно, вы можете создать отдельную функцию для каждого свойства или передать искомое свойство или вернуть четыре массива (?) ...
Option Explicit
Option Private Module
Sub test()
Dim tester As Variant
tester = GetCellProperties(ThisWorkbook.Worksheets(1))
MsgBox tester(LBound(tester), LBound(tester, 2))
MsgBox tester(UBound(tester), UBound(tester, 2))
End Sub
Function GetCellProperties(wsSourceWorksheet As Excel.Worksheet) As Variant
Dim wsTemp As Excel.Worksheet
Dim rngCopyOfUsedRange As Excel.Range
Dim i As Long
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
wsSourceWorksheet.Copy after:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count)
Set wsTemp = ActiveSheet
Set rngCopyOfUsedRange = wsTemp.UsedRange
rngCopyOfUsedRange.Formula = "=CellTop()"
wsTemp.Calculate
GetCellProperties = Application.WorksheetFunction.Transpose(rngCopyOfUsedRange)
Application.DisplayAlerts = False
wsTemp.Delete
Application.DisplayAlerts = True
Set wsTemp = Nothing
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Function
Function CellTop()
CellTop = Application.Caller.Top
End Function
Todd,
В ответ на ваш запрос на пользовательский UDF, я могу предложить только решение, близкое к тому, с чего вы начали. Это займет примерно в 10 раз больше времени для 10000 клеток. Разница в том, что ты возвращаешься к петлям через клетки.
Я запихиваю сюда свой личный конверт, так что, возможно, у кого-то будет способ получить его без пользовательского UDF.
Function GetCellProperties2(wsSourceWorksheet As Excel.Worksheet) As Variant
Dim wsTemp As Excel.Worksheet
Dim rngCopyOfUsedRange As Excel.Range
Dim i As Long
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
wsSourceWorksheet.Copy after:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count)
Set wsTemp = ActiveSheet
Set rngCopyOfUsedRange = wsTemp.UsedRange
With rngCopyOfUsedRange
For i = 1 To .Cells.Count
.Cells(i).Value = wsSourceWorksheet.UsedRange.Cells(i).Top
Next i
End With
GetCellProperties2 = Application.WorksheetFunction.Transpose(rngCopyOfUsedRange)
Application.DisplayAlerts = False
wsTemp.Delete
Application.DisplayAlerts = True
Set wsTemp = Nothing
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Function