2016-12-22 11 views
1

特定の条件を満たす場合に実行される関数をVisual Basicで作成しようとしています。そうでない場合、関数は終了します。条件が満たされない場合の終了関数 - Visual Basic

私の入力があれば今、私は、

Function answer(list As range) As String 

    Dim extent As Integer 
    extent = list.rows.Value 
    Dim array_1() As Double 
    ReDim array_1(1 To extent) As Double 
    Dim i As Integer 

    For i = 1 To extent 
     array_1(i) = list(i).value 
     If array_1(i) <> "L" Or array_1(i) <> "R" Or array_1(i) <> "PD" Or array_1(i) <> "D" Or array_1(i) <> "PD" Or array_1(i) <> "P" Or array_1(i) <> "S" Then 
      answer = "Your list is not valid" 
      Exit Function 
     End If 
     Next i 

    'Otherwise function will perform rest of code 

    answer = "Your list is valid" 

End Function 

を次のようにあります。たとえば、=answer(A1:A6) ...言うことができますし、等しくない「L」または「R」または「PD」などを行いA1 = "XXX"私の答えは「あなたのリストは有効ではない」と期待していますが、代わりに#VALUE!

なぜこれが当てはまるのかはわかりません。

+1

'範囲= list.rows.count' – nightcrawler23

+0

@Sotoに、あなたは以下の私の答えに私のコードを試してみましたか?どんなフィードバック? –

+0

@ShaiRado私は持っています。魅力的な作品!ありがとうございます。 – Soto

答えて

1

あり、あなたのコードに加える必要があるいくつかの変更:

  1. extentは範囲内の行数を持つようにするためには、extent = list.rows.countを使用しています。

  2. あなたがあなたのlist(Range.Cells)をループする必要があり、場合は、各cell.Valueをチェック

  3. ポイント3で(気づきのため@ nightcrawler23のおかげで)見て、配列array_1()を必要としませんあなたの特殊文字が含まれていません(私はSelect Caseを使用してコードを簡素化し、短縮しています)。

コード(試験した)

Function answer(list As Range) As String 

    Dim extent As Long 
    Dim cell As Range 

    extent = list.Rows.Count 

    ReDim array_1(1 To extent) 

    For Each cell In list.Cells 
     Select Case cell.Value 
      Case "L", "R", "PD", "D", "S" 

      Case Else 
       answer = "Your list is not valid" 
       Exit Function 

     End Select 
    Next cell 

    'Otherwise function will perform rest of code 
    answer = "Your list is valid" 

End Function 
+0

array_1はまったく必要ありません。これによりコードの多くが削減されます。 – nightcrawler23

+1

ちょうど 'ケース選択セルを使用してください。値 ' – nightcrawler23

+0

@ nightcrawler23ありがとう、あなたは正しいです、私は元のコードを使用していた、私はそれが必要ではないことに気付かなかった。 –

0

またはループをバイパスし、一行COUNTIF使用:

試験

Sub GetValues() 
MsgBox Answer([A1:B10]) 
End Sub 

functiを

Function Answer(list As Range) As Boolean 
Answer = (Evaluate("Sum(COUNTIF(" & list.Address & ",{""L"",""R"",""PD"",""D"",""S""}))") = list.Cells.Count) 
End Function 
関連する問題