Если вы действительно хотите просто использовать специальные ячейки, вам нужно сделать a для каждого цикла, но вот как это сделать без массива вариантов или проверки наличия пустой ячейки.Обратите внимание, что я использую словарь в обратном порядке (см. Примечания ниже) для хранения ячеек как элементов (не ключей), чтобы я мог использовать метод .Items, который выплевывает массив всех элементов в словаре.
Sub test()
Dim cell As Range
Dim i As Long
Dim dict As Object
Set dict = CreateObject("scripting.dictionary")
For Each cell In Range("A1:A10").SpecialCells(xlCellTypeConstants)
dict.Add i, cell.Value
i = i + 1
Next
Sheet1.Range("c1").Resize(dict.Count).Value = _
Application.Transpose(dict.items)
End Sub
Но есть более быстрый способ сделать это, если вы работаете с довольно большим диапазоном.Используйте объект словаря, так как он имеет возможность выплевывать массив всех ключей / элементов внутри него (которые вы можете транспонировать в диапазон).Коллекции не имеют этой возможности, но словари допускают только 1 из каждого ключа.Работа вокруг?Используйте словарь в обратном порядке, поместив ваши значения в качестве элементов и счетчик для ключей!
Вот пример того, как использовать вариантный массив / словарь (с разрешенными дубликатами):
Sub test()
Dim vArray As Variant
Dim i As Long, j As Long, k As Long
Dim dict As Object
Set dict = CreateObject("scripting.dictionary")
vArray = Range("A1:A10").Value
For i = 1 To UBound(vArray, 1)
For j = 1 To UBound(vArray, 2)
If Len(vArray(i, j)) <> 0 Then
dict.Add k, vArray(i, j)
k = k + 1
End If
Next
Next
Sheet1.Range("c1").Resize(dict.Count).Value = _
Application.Transpose(dict.items)
End Sub
Это намного быстрее , чем использование специальных ячеек (поскольку VBA обрабатывает работу без консультации с Excel), и вы можете использовать transpose, как если бы это была вставка, поэтому я предпочитаю этот метод.
Поскольку JFC имеетСледует отметить, что использование словарного объекта на самом деле не имеет особых преимуществ, основная причина в том, что массив можно легко транспонировать, а также можно перемещать его по горизонтали, что очень забавно.
Sheet1.Range(Cells(1, 3), Cells(1, dict.Count + 2)).Value = _
Application.Transpose(Application.Transpose(dict.items))