2016-01-18 2 views
0

Я не уверен, как выполнить следующую задачу: На столбце A У меня есть номера, на столбце B У меня есть имена, связанные с этими числами.Excel - генерировать случайный номер на основе двух других столбцов

Я хотел бы иметь возможность генерировать случайное число из столбца A, но только из чисел, которые не имеют ничего, связанных с столбцом B. Например: если у меня есть число в A1, но я не имеют имя в B1, число из A1 должно быть одним из тех, которые могут быть генерированы случайным образом.

Если A2 имеет число, а B2 не пусто (у него есть имя), я не хочу иметь A2 в случайном диапазоне.

Кроме того, было бы здорово иметь возможность и повторно генерировать случайное число (aka. Если я назначу число, скажем, 321, я хочу как-то сгенерировать случайное число снова, но оно должно не принимать во внимание 321, как это уже было назначено).

Я ценю любые идеи.

Образец

enter image description here

+0

Это не код для меня. Этот сайт предназначен для конкретных вопросов и ответов. –

+0

Я добавил несколько пояснений к теме. @ Grade'Eh'Bacon благодарит за это. Я надеялся, что есть кто-то, кто упоминает об этом. В принципе, используя Python или JavaScript, это не будет проблемой. Я просто хочу посмотреть, есть ли встроенный способ сделать это. – Robert

+0

Вы описываете таблицу, в которой столбцы, которые в строке B пусты, имеют ссылку на = rand() (или аналогичные), тогда как столбцы, которые в строке B имеют значение, имеют в строке A число, определенное каким-либо другим способом. Нажмите F9, чтобы восстановить ссылки на = rand(). Удачи! – BaldEagle

ответ

2

Вы можете попробовать следующее:

на основе ваших данных выборки/таблицы, выполните следующие действия:

1) в ячейке C1: поставить значение "0"

2) в ячейке C2: поставить формулу:

=IF(ISBLANK(B2), 1, 0)+OFFSET(C2,-1,0,1,1)

3) скопировать формулу в C2 вниз вместе со всеми вашими данными.

4) Положите эту формулу в любом месте вы хотите, чтобы отобразить рандомизированное # из столбца A:

=OFFSET(A1,MATCH(RANDBETWEEN(1,COUNTA(A:A)-COUNTA(B:B)),C:C,0)-1,0,1,1)

+0

Спасибо. Он работал как шарм. Я также ценю прогулку, поскольку легче увидеть логику. – Robert

+0

NP .. Единственный реальный недостаток этого парня - «вспомогательная колонка» (которую некоторые действительно ненавидят по какой-то причине);) lol В любое время я использую вспомогательный столбец. Я пытаюсь использовать смещение, поэтому он не «ломается» «когда вы вставляете/удаляете строку ...;) – Ditto

1

Я думаю, что вы будете иметь трудное время, делая это с функциями рабочего листа. Вот один быстрый и грязный подход, который работает по крайней мере часть времени ---

  1. В двух (или более) клеток, добавить формулу =RANDBETWEEN(COLUMN(A1),COLUMN(D1)), заменив A1 и D1 с первой и последней ячейки в вашем ряд чисел. Это вызовет случайные номера столбцов.
  2. Дайте каждой из этих ячеек уникальное имя, например, therand, therand2, ....
  3. В другой ячейке, которая будет вашим ответом, добавьте =IF(ISBLANK(INDIRECT(ADDRESS(2,therand))),INDIRECT(ADDRESS(1,therand)),INDIRECT(ADDRESS(1,therand2))). Это проверит, соответствует ли первый случайный номер столбца пустой метке (ISBLANK(...)), и если да, используйте соответствующее значение строки-1. Если нет, он будет использовать значение строки-1 из второго номера случайного столбца.
  4. Хит F9 для пересчета.

Это не всегда даст вам ячейку с пустой меткой. Добавьте более случайные номера столбцов и соответствующие статьи IF(...), чтобы уменьшить вероятность неправильного выбора.

Редактировать: Вы сказали «строка А» в исходном вопросе, но я вижу, что вы имели в виду «столбец А» (а не «строка 1»). Вам нужно будет перенести строки и столбцы в приведенные выше формулы, чтобы заставить их работать.

+0

Спасибо! Я думаю, что я смотрю на что-то вроде этого, что-то простое. Позвольте мне проверить это быстро и вернуться с вердиктом. – Robert

+0

Спасибо за редактирование, действительно, я имел в виду столбцы. С наилучшими пожеланиями – Robert

+0

Я просто подумал о другом варианте, и получается, что @Ditto избил меня :). Попробуйте этот ответ. – cxw

1

Вот ответ VBA. Он может быть использован непосредственно в качестве функции рабочего листа:

Function RandUnassigned(R As Range) As Variant 
    Application.Volatile 
    Dim A As Variant, i As Long, n As Long 
    Dim num As Long 
    n = R.Rows.Count 

    ReDim A(1 To n) 
    For i = 1 To n 
     If Len(R.Cells(i, 2)) = 0 Then 
      num = num + 1 
      A(num) = R.Cells(i, 1) 
     End If 
    Next i 
    RandUnassigned = A(Application.WorksheetFunction.RandBetween(1, num)) 
End Function 

Используется так:

enter image description here

Это пересчитывает каждый раз, когда таблица делает. Если вы хотите, чтобы он набрал случайное число только один раз, удалите строку Application.Volatile из определения функции.

+0

Спасибо, John, Это помогает мне понять, как перенести код Python на что-то, что понимает VB. – Robert

+0

Я делаю и много Python, и много VBA, и всякий раз, когда я делаю VBA после выполнения Python, я нахожу себя разочарованным, когда понимаю, что мне нужно написать 20 или 30 строк VBA, чтобы получить функциональность одного Понимание списка Python. Тем не менее - у VBA есть свои прелести, и была сделана интересная работа, позволяющая вызвать Python из VBA. Есть хороший блог, который периодически обсуждает некоторые из проблем: https://newtonexcelbach.wordpress.com/ –

+0

Благодарим за это. Прежде чем я задал вопрос, я искал дополнение, которое должно облегчить это. Ваша рекомендация в блоге. Я ценю это. – Robert

Смежные вопросы