Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Выбор случайных значений из столбца А в столбец В

32K
22 августа 2008 года
serega575757
16 / / 21.07.2008
Вот код, который выбирает из 50 ячеейк столбца А значения в случайном порядке и вставляет их в столбец В.
А КАК СДЕЛАТЬ ТАК, ЧТОБЫ КОЛИЧЕСТВО ЗНАЧЕНИЙ ОПРЕДЕЛЯЛОСЬ ПО КОЛИЧЕСТВУ ИМЕЮЩИХСЯ ЗНАЧЕНИЙ В СТОЛБЦЕ А? Ведь количество значений в столбце А у меня будет меняться. Там может быть как 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
17K
22 августа 2008 года
HookEst
144 / / 27.03.2008
Цитата:
А КАК СДЕЛАТЬ ТАК, ЧТОБЫ КОЛИЧЕСТВО ЗНАЧЕНИЙ ОПРЕДЕЛЯЛОСЬ ПО КОЛИЧЕСТВУ ИМЕЮЩИХСЯ ЗНАЧЕНИЙ В СТОЛБЦЕ А?


Заменить везде в коде 50 на нужное количество значений))


А вообще, такой подход , хорош когда количество всех возможных значений много больше количества выбираемых значений. в нашем случае (Вашем) 50=50, и выполняется много лишней работы(в первый запуск показало 268 выполненых циклов вместо 50, а теоретически, алгоритм может никогда не закончится)
Другой вариант:

Код:
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

Пояснять пока не буду, попробуйте сами разобраться...
32K
22 августа 2008 года
serega575757
16 / / 21.07.2008
Да, пойду разбираться.
А что касается "Заменить везде в коде 50 на нужное количество значений))", то смысл как раз в том и состоит, что в столбце А всегда будет находится различное количество значений. Не буду же я постоянно код менятЬ, правильно? соответственно, программа сама должна распознавать количество имеющихся значений.
32K
24 августа 2008 года
serega575757
16 / / 21.07.2008
Sub RandCol(Source As Range, Destination As Range)
Если я оставляю параметры в скобках, код сам не выполняется, а просит выбрать процедуру из имеющихся. то есть эту процедуру не видит.
а если я параметры вставляю отдельно от названия процедуры, то прога ругается на параметры, что они не определены.
17K
25 августа 2008 года
HookEst
144 / / 27.03.2008
Usage:
 
Код:
Sub t()
    RandCol Range("A:A"), Range("B:B")
End Sub
32K
25 августа 2008 года
serega575757
16 / / 21.07.2008
HookEst, спасибо Вам!!!!!! Все заработало!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог