2011-08-03 34 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

相關問題