Если вы не используете старый старый компьютер или у вас есть рабочий лист XL2007 с базилией строк, цикл будет достаточно быстрым. Честное слово!
Не доверяешь мне? Посмотри на это. Я заполнил диапазон в миллион строк случайными буквами, используя это:
=CHAR(RANDBETWEEN(65,90))
Затем я написал эту функцию и вызвал ее из диапазона из 26 ячеек, используя Control-Shift-Enter:
=TRANSPOSE(UniqueChars(A1:A1000000))
Вот не очень оптимизированная функция VBA, которую я взломал за пару минут:
Option Explicit
Public Function UniqueChars(rng As Range)
Dim dict As New Dictionary
Dim vals
Dim row As Long
Dim started As Single
started = Timer
vals = rng.Value2
For row = LBound(vals, 1) To UBound(vals, 1)
If dict.Exists(vals(row, 1)) Then
Else
dict.Add vals(row, 1), vals(row, 1)
End If
Next
UniqueChars = dict.Items
Debug.Print Timer - started
End Function
На моем летнем ноутбуке Core 2 Duo T7300 (2 ГГц) это заняло 0,58 с.