2011-08-03 37 views
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 
    ... ... 

回答

1

从概念上讲,你可以做多种方式,但这里有一个(VBA),您会使用所有可能的选项数组然后从列表中获得一个随机元素:

  1. 创建UDF的范围和搜索值
  2. 循环遍历行,如果它等于您的搜索值,获取单元格中的值偏移-1并将其存储在一个数组中
  3. 一旦你完成,你会有一系列所有可能的答案。使用randbetween函数并为其指定数组的lbound和ubound。
  4. 返回i元素,其中i是它选取的随机数。

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 
+0

谢谢你把它放在一起。我正在寻找一个公式解决方案,因为我不想部署VBA代码。然而,这似乎是一个很好的vba解决方案。 – SFun28

+0

不客气!我更喜欢使用VBA来处理这种情况,因为代码变得非常灵活。由于这个函数列出了所有的B值等于某个值的A值,所以你可以调整它来做各种事情,比如找到列表中的最大值,创建所有匹配的字符串,返回匹配的数量等等。因为在获得随机数之前你需要计算匹配数(所以你可以设置范围),这可能实际上超出了公式的范围。 – aevanko

1

老问题,我知道......但如果你还有兴趣这里有一个公式解决方案在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中包含你所选择的文本,那么......

+0

由于这是一个CSE函数,因此当您仍在公式中时,您需要点击CTRL + SHIFT + ENTER。它将括起公式并返回结果。否则(如果你只是按回车键),你会得到#NUM错误,无论是否有匹配的值。应该指出的是,这适用于文本值而不是数字值。只要把DOG或任何你的文字值代替上面的3,不需要在引号中。 – TechnicalEmployee

相关问题