2017-12-12 18 views
-1

以下は1 and 10の間のランダム値を返すことになっていますが、これはまだcolumn Aにありません。ランダム値を見つけ出してループを終了するという点ではうまくいきますが、=Ang()を使用して呼び出すとExcelでは#Value!が返されます。VBA関数が呼び出されたときに#VALUEを返す

Function Ang() 
    i = 0 
    Do 
    i = Application.WorksheetFunction.RandBetween(1, 10) 
    Ang = i 
    MsgBox Ang 
    Loop While Application.WorksheetFunction.IfNa(Application.WorksheetFunction.Match(i, Worksheets("Sheet2").Range("A:A"), 0), 0) 
End Function 

enter image description here

+1

msgboxの行を削除してください –

+0

@PatrickHonorezこれは私が第二に考えている助言ですが、それは問題の原因ではありません。 – GSerg

+1

[Excel VBAの可能な重複:一致することができません、 "WorksheetFunctionクラスのMatchプロパティを取得できません"](https://stackoverflow.com/q/17751443/11683) – GSerg

答えて

0

問題は、それが見つからない場合WorksheetFunction.Matchがエラーでコードを停止しますです。

使用Application.Match代わり:

回避するために、数字の範囲内
Function Ang() as Long 
    Dim i as Long 
    i = 0 
    Do 
    i = Application.WorksheetFunction.RandBetween(1, 10) 
    Ang = i 
    MsgBox Ang 
    Loop While Not IsError(Application.Match(i, Worksheets("Sheet2").Range("A:A"), 0)) 
End Function 

それとも

Function Ang() 
    i = 0 
    Do 

    i = Application.WorksheetFunction.RandBetween(1, 10) 
    Ang = i 
    MsgBox Ang 
    Loop While Application.WorksheetFunction.CountIf(Worksheets("Sheet2").Range("A:A"), i) 
End Function 
+0

スーパーマン。早かった。どうもありがとう。 Match関数がエラーでコードを停止させることは、どのようにしてわかりますか?マニュアルはありますか? –

+0

試行錯誤。 –

0

ではなく、ハード配線、関数に引数にしない理由は?

enter image description here

無限ループに対する機能のガードを:のように使用

Function NewRandom(R As Range, a As Long, b As Long) As Variant 
    'returns a random number in a,b which isn't in range R 
    Dim i As Long, k As Long, rand As Long 
    Dim c As Range 
    Dim avoid As Variant 
    Dim count As Long 

    ReDim avoid(a To b) As Boolean 
    For Each c In R.Cells 
     k = c.Value 
     If a <= k And k <= b Then 
      avoid(k) = True 
      count = count + 1 
     End If 
    Next c 

    If count = b - a + 1 Then 'error condition! 
     NewRandom = CVErr(xlErrValue) 
    Else 
     Do 
      rand = Application.WorksheetFunction.RandBetween(a, b) 
     Loop While avoid(rand) 
     NewRandom = rand 
    End If 
End Function 

。 B1で=NewRandom(A1:A7,1,5)を使用した場合、エラー#VALUE!が返されます。このコードでは、aからbまでの範囲があまり大きくなく、メモリが大幅に消費されないと仮定しています。そうであれば、配列avoidは辞書に置き換えることができます。

+0

ニース!ありがとう。 –

関連する問題