View Single Post
  #10   Report Post  
Posted to microsoft.public.excel.programming
William Benson[_2_] William Benson[_2_] is offline
external usenet poster
 
Posts: 230
Default strange randomization

Cush,

I haven't heard of dictionary, can you tell me how dictionary differs from
collection different?

This line: Uniques(i) = oCell.Value

is going to mean a value gets entered in the uniques column whether or not
it had occurred prior, right?

Sorry, it is late for me, I may not be thinking right.
"cush" wrote in message
...
If I were doing this I would first insert a col B (later to be hidden)
where
I would consolidate all the data from colA (getting rid of blanks and
duplicates) with the following macro:

Sub CreateUniqueList
'Requires a reference to MS Scripting Runtime
'In the VBA Editor, click on
'ToolsReferencesMicrosoft Scripting Runtime
''''''''''''''''''''''''''''''''''''''''''''''

Dim Dict As Scripting.Dictionary
Dim i As Integer
Dim oCell As Range
Dim Source As Range
Dim Uniques As Range

Set Source = Range("A:A")
Set Uniques = Range("B:B")

Set Dict = New Dictionary
i = 1
With Dict
For Each oCell In Source
If Not .Exists(oCell.Value) Then
If Not oCell.Value = "" Then
.Add Key:=oCell.Value, Item:=i
Uniques(i) = oCell.Value
i = i + 1

End If
End If
Next oCell
End With

Shutdown:
Set Dict = Nothing

End Sub

I would then change my original formula from A:A to B:B

=INDEX(B:B,ROUND(RAND()*COUNTA(B:B),0))

This would clean it up and avoid problems with blanks.

"William Benson" wrote:

User enters any array of numbers beginning in any cell: Example

A15 23
A16 11
A17 5
. .
. .
. .
A172 145
A173 220


Required: Formula (not VBA, but perhaps array-entered) which will:

1) return a RANDOM number from AMONG the items in the list
2) Not require that the list start, list end, or # of items in
the
list be fixed (only col A is fixed).
3) not require that the list be in ascending or descending order
3) be entered in cell B1

I started something involving INDEX and the ROW() of the starting and
ending
item, but I want it to be more dynamic. Then I tried to use MATCH to tell
me
the start or end values, by using 0.001 and 1,000,000 and matching with
Match_Type = 1, or -1, but that required the items be in ascending or
descending order. So, I am stuck... can it be done?