2011-08-03 5 views
2

주어진 B 값과 관련된 열 A의 값을 임의로 선택하는 데 사용할 수있는 가장 간단한 수식은 무엇입니까? 따라서 아래 표에서 임의로 B = 3 인 A를 선택하려고합니다. 따라서 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 : 여기 지정한 번호의 범위를 순환 코드의 예이며,이 발견되면, 가능한 결과의 배열은 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 

최적화

: 여기 동일한 기능의보다 유연한 버전이다. 살펴볼 범위, 찾고자하는 대상, 무작위 결과를 원하는 셀의 오프셋 값 등 세 가지 매개 변수가 필요합니다. 또한 변형을 사용하므로 텍스트 나 숫자를 검색 할 수 있습니다. 귀하의 경우 그래서, 당신은 쓸 것 : 여기
=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 : B10 .....에 3이 없거나 IFERROR로 묶여이 경우 선택한 텍스트를 반환하면 오류가 발생합니다.

+0

이것은 CSE 함수이므로 수식에있는 동안 Ctrl + Shift + Enter를 눌러야합니다. 수식을 괄호로 묶고 결과를 반환합니다. 그렇지 않으면 (입력 한 경우) 일치하는 값의 유무와 관계없이 #NUM 오류가 발생합니다. 이것은 숫자 값 대신 텍스트 값에 대해 잘 작동한다는 점에 유의해야합니다. 그냥 개를 넣거나 위의 3 대신에 텍스트 값이 무엇이든간에 따옴표로 묶을 필요는 없습니다. – TechnicalEmployee

관련 문제