随机选择另一列的一个列子集中的值

时间:2011-08-03 17:36:39

标签: excel excel-2007 excel-formula excel-2010

我可以使用什么最简单的公式来随机选择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 个答案:

答案 0 :(得分:1)

从概念上讲,你可以通过多种方式实现这一目标,但是这里有一个(VBA)你可以使用一系列可能的选择,然后从该列表中获取一个随机元素:

  1. 创建一个带有范围和搜索值的udf
  2. 遍历行,如果它等于您的搜索值,请获取单元格偏移-1中的值并将其存储在数组中
  3. 完成后,您将获得所有可能答案的数组。使用randbetween函数并为其指定数组的lbound和ubound。
  4. 返回i元素,其中i是它所选择的随机数。
  5. <强>更新: 下面是一个代码示例,它遍历您指定的数字的范围,如果找到它,它会将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
    

答案 1 :(得分: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中附上以返回您选择的文本....