与えられた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
... ...
与えられた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(VBA)があります:
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
古い質問私が知っている......しかし、あなたはまだ興味があるなら、ここで式ソリューションがあります:
=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で囲んでその場合のテキストを返します。
これはCSE関数なので、数式中にCtrl + Shift + Enterキーを押す必要があります。これは数式を括弧で括って結果を返します。それ以外の場合(Enterキーを押しただけの場合)、一致する値があるかどうかにかかわらず、#NUMのエラーが発生します。これは、数値値ではなくテキスト値でうまく機能することに注意してください。上記の3の代わりに犬を置くか、テキストの値が何であれ、引用符で囲む必要はありません。 – TechnicalEmployee
これをまとめるとありがとうございます。 VBAコードを展開したくないので、私は数式のみのソリューションを探していました。しかし、これは良いvbaの解決策のようです。 – SFun28
大歓迎です!私はコードが超柔軟になるので、このような場合にはVBAを使うことを好む。この関数はBが何かと等しいすべてのAの値のリストを作成するので、それを調整してリストの最大値を見つけたり、すべての一致の文字列を作成したり、一致の数を返すなど乱数を得る前に一致数が必要なので(範囲を設定できるように)、これは実際に数式の範囲外にあるかもしれません。 – aevanko