Sub RandCol(Source As Range, Destination As Range)
Dim src As Range
Dim dst As Range
Dim data
Dim i As Long
Dim max As Long
Set src = Source.Cells(1).EntireColumn
Set src = Range(src.Cells(1), src.Cells(65536).End(xlUp))
Set dst = Destination.Cells(1).EntireColumn.Cells(1)
If src.Cells.Count = 1 Then
dst = src
Exit Sub
End If
data = src.Value
If IsEmpty(data) Then Exit Sub
max = UBound(data)
Randomize
While max > 0
i = Int(max * Rnd + 1)
dst = data(i, 1)
data(i, 1) = data(max, 1)
Set dst = dst.Offset(1)
max = max - 1
Wend
End Sub
Выбор случайных значений из столбца А в столбец В
А КАК СДЕЛАТЬ ТАК, ЧТОБЫ КОЛИЧЕСТВО ЗНАЧЕНИЙ ОПРЕДЕЛЯЛОСЬ ПО КОЛИЧЕСТВУ ИМЕЮЩИХСЯ ЗНАЧЕНИЙ В СТОЛБЦЕ А? Ведь количество значений в столбце А у меня будет меняться. Там может быть как 1 значений, так и 200 и более.
Спасибо
Sub ColumnA_Random_to_B()
'В редакторе VBA в меню Tools, пункт Reference
' в диалоге поставте галочку для Microsoft Scripting Runtime.
Dim pAll As New Scripting.Dictionary
Dim RndRow As Integer, CountInB As Integer
Randomize
CountInB = 1&
Do
RndRow = Int((50 * Rnd) + 1)
' проверим, что ячейку с таким номером строки ещё не копировали
If Not pAll.Exists(CStr(RndRow)) Then
pAll.Add CStr(RndRow), CountInB
Cells(CountInB, "B").Value = Cells(RndRow, "A").Value
CountInB = CountInB + 1
End If
Loop While (CountInB <= 50)
End Sub
Цитата:
А КАК СДЕЛАТЬ ТАК, ЧТОБЫ КОЛИЧЕСТВО ЗНАЧЕНИЙ ОПРЕДЕЛЯЛОСЬ ПО КОЛИЧЕСТВУ ИМЕЮЩИХСЯ ЗНАЧЕНИЙ В СТОЛБЦЕ А?
Заменить везде в коде 50 на нужное количество значений))
А вообще, такой подход , хорош когда количество всех возможных значений много больше количества выбираемых значений. в нашем случае (Вашем) 50=50, и выполняется много лишней работы(в первый запуск показало 268 выполненых циклов вместо 50, а теоретически, алгоритм может никогда не закончится)
Другой вариант:
Код:
Пояснять пока не буду, попробуйте сами разобраться...
А что касается "Заменить везде в коде 50 на нужное количество значений))", то смысл как раз в том и состоит, что в столбце А всегда будет находится различное количество значений. Не буду же я постоянно код менятЬ, правильно? соответственно, программа сама должна распознавать количество имеющихся значений.
Если я оставляю параметры в скобках, код сам не выполняется, а просит выбрать процедуру из имеющихся. то есть эту процедуру не видит.
а если я параметры вставляю отдельно от названия процедуры, то прога ругается на параметры, что они не определены.
Код:
Sub t()
RandCol Range("A:A"), Range("B:B")
End Sub
RandCol Range("A:A"), Range("B:B")
End Sub
HookEst, спасибо Вам!!!!!! Все заработало!