Выбор значений из списка (Эксел)

Программирование на Visual Basic for Applications
Brudda
Обычный пользователь
Обычный пользователь
 
Сообщения: 79
Зарегистрирован: 21.02.2005 (Пн) 14:47
Откуда: Рига

Выбор значений из списка (Эксел)

Сообщение Brudda » 15.12.2007 (Сб) 1:41

Привет!
Не получается у меня решить такую "задачку": есть список, состоящий из неповторяющихся записей. Из списка необходимо выбрать, скажем 10, произвольных записей ("подсписок") и эти, выбранные, записи тоже не должны повторяться. Такая выборка производится время от времени и выбираемый "подсписок" должен не повторять предыдущие "подсписки".
Я накарябал так:
Код: Выделить всё
WordCount = 1

Do While Sheets("Sheet2").Cells(WordCount, 1).Value <> ""
    WordCount = WordCount + 1
Loop

   WordCount = WordCount - 1
 
Randomize
   For TargetRow = 1 To 10
       SourceRow = Int((WordCount * Rnd) + 1)
       Cells(TargetRow, 1).Value = Sheets("Sheet2").Cells(SourceRow, 1).Value
   Next TargetRow



Но проблема в том, что Rnd регулярно выдает повторяющиеся значения. И ничего путного я придумать не могу - как избавится от повторяющихся значений. Может есть какие идеи?
Заранее спасибо.
С почтением,
Brudda

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 15.12.2007 (Сб) 16:58

Ситуация решается стандартно.
Заполняешь пул, выбираешь из него произвольный элемент, удаляешь элемент из пула.
Lasciate ogni speranza, voi ch'entrate.

Brudda
Обычный пользователь
Обычный пользователь
 
Сообщения: 79
Зарегистрирован: 21.02.2005 (Пн) 14:47
Откуда: Рига

Сообщение Brudda » 17.12.2007 (Пн) 0:53

Alibek, спасибо. Совет, видимо, дельный, но я, к стыду своему, не знаю что такое пул (применительно к программированию).
Я написал так:
Код: Выделить всё
WordCount = 1
Do While Sheets("Sheet2").Cells(WordCount, 1).Value <> ""
    WordCount = WordCount + 1
Loop
WordCount = WordCount - 1
Randomize

For TargetRow = 1 To 10
    SourceRow = Int((WordCount * Rnd) + 1)
    CheckRow = 1
    CheckSum = 0
    Do While CheckRow <> TargetRow
        If SourceRow = Cells(CheckRow, 4).Value Then CheckSum = 1
        CheckRow = CheckRow + 1
    Loop

    If CheckSum = 1 Then TargetRow = TargetRow - 1
    If CheckSum = 0 Then
        Cells(TargetRow, 1).Value = Sheets("Sheet2").Cells(SourceRow, 1).Value
        Cells(TargetRow, 4).Value = SourceRow
    End If
Next TargetRow


Наверно, это не самый рациональный способ, но работает, кажись правильно. Может подскажешь, что такое пул и с чем его едят?
С почтением,
Brudda

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 17.12.2007 (Пн) 8:56

Пул -- это пул. Просто некая "емкость", в которой ты хранишь какие-то записи. Это может быть массив, коллекция, связанный список.
Применительно к твоему случаю будет проще использовать массив.
Создай массив, заполни его значениями из своего списка. Затем выбирай случайный элемент из массива, добавляй этот в другой список, а из массива его убирай.
Lasciate ogni speranza, voi ch'entrate.

Krasnaja Shapka
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 87
Зарегистрирован: 26.10.2006 (Чт) 12:13
Откуда: Киев

Сообщение Krasnaja Shapka » 17.12.2007 (Пн) 15:47

или юзай рандомайз с проверкой... MyRandom = Int((WordCount * Rnd) + 1)... если значение повторилось - отпять рандомайз.. иначе идет присвоение "SourceRow = MyRandom"
Если ясность вашего объяснения исключает ложное толкование, все равно кто-то поймет вас неправильно.

Brudda
Обычный пользователь
Обычный пользователь
 
Сообщения: 79
Зарегистрирован: 21.02.2005 (Пн) 14:47
Откуда: Рига

Сообщение Brudda » 17.12.2007 (Пн) 22:49

Мда, решения настолько очевидные, что начинаешь сомневаться в своих умственных способностях...
Коллеги, спасибо.
С почтением,
Brudda


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 51

    TopList