什么是最简单的公式,我可以用它来随机选择列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
... ...
什么是最简单的公式,我可以用它来随机选择列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
... ...
从概念上讲,你可以做多种方式,但这里有一个(VBA),您会使用所有可能的选项数组然后从列表中获得一个随机元素:
UPDATE: 下面是通过为指定的数目的范围内循环的代码示例,并且如果它发现它,它增加了该列值的可能结果的数组。然后生成一个随机数并用于从该列表中返回一个随机值。
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
老问题,我知道......但如果你还有兴趣这里有一个公式解决方案在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中包含你所选择的文本,那么......
由于这是一个CSE函数,因此当您仍在公式中时,您需要点击CTRL + SHIFT + ENTER。它将括起公式并返回结果。否则(如果你只是按回车键),你会得到#NUM错误,无论是否有匹配的值。应该指出的是,这适用于文本值而不是数字值。只要把DOG或任何你的文字值代替上面的3,不需要在引号中。 – TechnicalEmployee
谢谢你把它放在一起。我正在寻找一个公式解决方案,因为我不想部署VBA代码。然而,这似乎是一个很好的vba解决方案。 – SFun28
不客气!我更喜欢使用VBA来处理这种情况,因为代码变得非常灵活。由于这个函数列出了所有的B值等于某个值的A值,所以你可以调整它来做各种事情,比如找到列表中的最大值,创建所有匹配的字符串,返回匹配的数量等等。因为在获得随机数之前你需要计算匹配数(所以你可以设置范围),这可能实际上超出了公式的范围。 – aevanko