Концептуально вы можете сделать это несколькими способами, но вот один (VBA), где вы будете использовать массив возможных вариантов, а затем получить случайный элемент из этого списка:
- Создать udfкоторый принимает диапазон и значение поиска
- Перебирает строку и, если оно равно вашему значению поиска, получает значение в смещении ячейки -1 и сохраняет его в массиве
- Как только выГотово, у вас будет множество всех возможных ответов.Используйте функцию randbetween и задайте для нее lbound и ubound вашего массива.
- Верните элемент 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