Произвольно выбрать значение в одном подмножестве столбцов другого столбца - PullRequest
2 голосов
/ 03 августа 2011

Какую простейшую формулу я могу использовать для случайного выбора значения в столбце A, связанного с данным значением B. Итак, в приведенной ниже таблице я выбираю случайным образом A, где B = 3. Так что я случайно выбираю между строкой 1 (5.4) и строкой 3 (4.2). Обратите внимание, что эта таблица может быть сколь угодно большой.

    A     B

1   5.4   3          
2   2.3   1
3   4.2   3
4   9.2   2
    ...   ...

Ответы [ 2 ]

1 голос
/ 04 января 2012

Старый вопрос, который я знаю ...... но если вы все еще заинтересованы, вот формульное решение, предполагающее данные в A2:B10

=INDEX(A2:A10,SMALL(IF(B2:B10=3,ROW(A2:A10)-ROW(A2)+1),RANDBETWEEN(1,COUNTIF(B2:B10,3))))

, возвращает #NUM!ошибка, если в B2 нет 3: B10 ..... или приложите в IFERROR, чтобы в этом случае вернуть текст по вашему выбору ....

1 голос
/ 04 августа 2011

Концептуально вы можете сделать это несколькими способами, но вот один (VBA), где вы будете использовать массив возможных вариантов, а затем получить случайный элемент из этого списка:

  1. Создать udfкоторый принимает диапазон и значение поиска
  2. Перебирает строку и, если оно равно вашему значению поиска, получает значение в смещении ячейки -1 и сохраняет его в массиве
  3. Как только выГотово, у вас будет множество всех возможных ответов.Используйте функцию randbetween и задайте для нее lbound и ubound вашего массива.
  4. Верните элемент i, где i - случайное число, которое он выбрал.

UPDATE Вот пример кода, который перебирает диапазон для указанного вами числа, и, если он его находит, он добавляет значение столбца A в массив возможных результатов.Затем генерируется случайное число, которое используется для возврата случайного значения из этого списка.

Function GetRand(ByVal cell_range As Range, ByVal criteria As Double) As Double

Dim cell As Range
Dim rNum As Long
Dim i As Long
Dim possibleChoices() As Double
ReDim possibleChoices(1 To cell_range.Count)

i = 1
For Each cell In cell_range
    If cell.Value = criteria Then
        possibleChoices(i) = cell.Offset(0, -1).Value
        i = i + 1
    End If
Next

rNum = Application.WorksheetFunction.RandBetween(1, i - 1)
GetRand = possibleChoices(rNum)

End Function

Оптимизация: вот более гибкая версия той же функции.Требуется 3 параметра - диапазон, в котором вы хотите посмотреть, что вы хотите найти, и значение смещения ячейки, из которой вы хотите получить случайный результат.Он также использует варианты, так что вы можете искать текст или цифры.Итак, в вашем случае вы бы написали:

=GetRand(B1:B5, 3, -1)

Вот код:

Function GetRand(ByVal cell_range As Range, _
                 ByVal criteria As Variant, _
                 ByVal col_offset As Long) As Variant

Application.ScreenUpdating = False
Dim cell As Range
Dim rNum As Long
Dim i As Long
Dim possibleChoices() As Variant
ReDim possibleChoices(1 To cell_range.Count)

i = 1
For Each cell In cell_range
    If cell.Value = criteria Then
        possibleChoices(i) = cell.offset(0, col_offset).Value
        i = i + 1
    End If
Next

rNum = Application.WorksheetFunction.RandBetween(1, i - 1)

GetRand = possibleChoices(rNum)
Application.ScreenUpdating = True

End Function
...