Отвечая на мой собственный вопрос, основываясь на информации, которую я узнал из комментариев.
Вот как я это сделал, используя Коллекции:
Sub collections()
Randomize
Dim x As Byte
Dim coll As New Collection
Dim pick As Integer
Dim i As Byte: i = 1
For x = 0 To 99
coll.Add x
Next
Do While coll.Count <> 0
pick = Int((coll.Count - 1 + 1) * Rnd + 1)
'Cells(i, 1).Value = coll.Item(pick)
coll.Remove (pick)
i = i + 1
Loop
end sub
Немного затянуто, но я хотел проверить, чтобы убедиться, что оно работает правильно (поэтому пишите в активный лист и я как счетчик).
Вот как я это сделал, используя словарь:
Sub dictionary()
Randomize
Dim dict As New Scripting.dictionary
Dim x As Byte
Dim pick As Integer
Dim i As Byte: i = 1
For x = 0 To 99
Do
pick = Int((99 - 0 + 1) * Rnd + 0)
Loop Until Not dict.Exists(pick)
dict.Add pick, 0
'Cells(i, 4).Value = pick
i = i + 1
Next
End Sub
И когда я сравнивал два способа сделать это, сабвуфер сборов всегда был быстрее в ~ 10 раз.
Dim StartTime As Double
Dim ElapsedTime As Double
Dim TotalTime As Double
Dim x As Byte
For x = 1 To 100
StartTime = Timer
Call collections
ElapsedTime = Timer - StartTime
TotalTime = TotalTime + ElapsedTime
Next
Debug.Print TotalTime & " Collections"
TotalTime = 0
For x = 1 To 100
StartTime = Timer
Call dictionary
ElapsedTime = Timer - StartTime
TotalTime = TotalTime + ElapsedTime
Next
Debug.Print TotalTime & " Dictionary"