2011-08-03 8 views
2

与えられたB値に関連付けられた列Aの値をランダムに選択するために使用できる最も単純な式は何ですか?下の表では、ランダムにB = 3のAを選択します。そのため、1行(5.4)と3行(4.2)の間でランダムに選択しています。この表は任意に大きくすることができます。ランダムに1つの列サブセットの値を別の列で選択する

A  B 

1 5.4 3   
2 2.3 1 
3 4.2 3 
4 9.2 2 
    ... ... 

答えて

1

概念的あなたはそれにいくつかの方法を行うことができますが、ここであなたは、そのリストからランダム要素を取得可能な選択肢の配列を使用したい1(VBA)があります:

  1. 作成範囲と検索値を取るudf
  2. 行をループし、検索値と等しい場合は、セルオフセット-1の値を取得して配列に格納します。
  3. 完了するとすべての可能な答えの配列を持っています。 randbetween関数を使用して、配列のlboundとuboundを与えます。
  4. 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つのパラメータがあります - あなたが見たい範囲、見つけたいもの、そしてランダムな結果を望むセルのオフセット値。また、バリアントを使用するので、テキストや数字を検索できます。だからあなたの場合には、あなたが書いたと思います:

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

古い質問私が知っている......しかし、あなたはまだ興味があるなら、ここで式ソリューションがあります:

=GetRand(B1:B5, 3, -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:B10 .....に3がない場合はエラー、IFERRORで囲んでその場合のテキストを返します。

+0

これはCSE関数なので、数式中にCtrl + Shift + Enterキーを押す必要があります。これは数式を括弧で括って結果を返します。それ以外の場合(Enterキーを押しただけの場合)、一致する値があるかどうかにかかわらず、#NUMのエラーが発生します。これは、数値値ではなくテキスト値でうまく機能することに注意してください。上記の3の代わりに犬を置くか、テキストの値が何であれ、引用符で囲む必要はありません。 – TechnicalEmployee

関連する問題