2016-12-24 2 views
0

On Error Resume Nextは次の行ではなく次の文に進むので、誰かがIf文でそれを使用することについて提案していますか?上記If文の各スタイルで On Errorを次のIf文で使用する

On Error Resume Next 
For i = 1 To r 
    If dataArray(i,1) <10 Then 
     intA = intA + 1 
    End If 
    If dataArray(i,2) <10 Then intB = intB + 1 
    If dataArray(i,2) <10 Then _ 
     intC = intC + 1: intD = intD + 1 
Next i 
On Error GoTo 0 

は、添加は、依然として、そのような要素dataArray(I、1)を含むテキストとして、エラーが発生した場合に行われます。これはエラーハンドラで修正することができますが、複数のIf文では面倒です。誰にも何か提案はありますか?

+1

あなたが達成しようとしているものをよりよく説明することができますか?どこでエラーが発生していますか( 'On Error Resume Next'を使わずに)。時々あなたのエラーをトラップして処理するほうが良い) –

+0

追加のテスト 'If Err.Number = 0'をいつでも追加することができます。適切な場合は' Err.Clear'のようなステートメントを使うこともできます。しかし、「On Error Resume Next」メカニズムは大量に計算すべきではありません。それは例外的な便利な「トリック」ですが、実際にコード内で数えたい場合は、この決定を本当に再考する必要があります。 –

+0

例えば、上記のコードでは、変数が数値であることが保証されていない場合、*良い*コードはエラーハンドリング時にカウントするのではなく、IsNumericで最初にテストする必要があります。指令。 –

答えて

0

配列の指定位置に桁の値があると予想される場合は、かさばるエラーハンドラを作成するか、GoToを使用する必要はありません。Typeの変数をチェックできます。 ので、例:あなたが見たよう

For i = 1 To r 
    If IsNumeric(dataArray(i,1)) And Not IsString(dataArray(i,1)) Then 
     If dataArray(i,1) <10 Then 
      intA = intA + 1 
     End If 
     If dataArray(i,2) <10 Then intB = intB + 1 
     If dataArray(i,2) <10 Then _ 
      intC = intC + 1: intD = intD + 1 
    End If 
Next i 

Public Function IsString(ByRef var as Variant) as Boolean 
    IsString = (TypeName(var) = "String") 
End Function 

、あなたがして明示的にNot IsStringをチェックし、文字列が数値であることができるので、IsNumericをチェックすることができます。

文字列はIsNumeric関数(例:chars)からTrueを返すだけでなく、例を変更して独自の関数を拡張する方法があるためです。

リンク: TypeNameIsNumeric

さらなる例(一方小数点および可能文字列と数字のみ)。 入力がどのように見えるのであれば何です:

input

例:

Sub AcceptOnlyNumbers() 
'pass only strings that can be threaten as doubles 
    Dim rng As Range 
    Dim cl As Range 

    Set rng = Sheets(1).[A1:A8] 

    For Each cl In rng 
     With cl 
     If Not (IsNumeric(.Value2) Or (IsNumeric(Val(.Value2)) And _ 
      Len(.Value2) = Len(CStr(Val(.Value2))))) And .Value2 <> vbNullString Then 
       Debug.Print .Value2, "is filtered" 
      Else 
       Debug.Print .Value2, "is passed" 
      End If 
     End With 
    Next 

End Sub 

出力:

output

と小数点がカンマであれば、その後、我々はCDblで文字列を変換することができますが小数点の場合はValとなります。気軽に遊んでみてください!

Public Function IsWholeNumber(ByVal expDbl As Double) as Boolean 
    IsWholeNumber = (Int(expDbl) = expDbl) 
    'or more bulky but ok too: IsWholeNumber = InStr(Str(expDbl), ".") = 0 
End Function 

: - あなたは小数を必要としない場合たとえば、あなたがこの後に別のチェックを追加することができます(もう一度、あなた自身の構築、またはすべてこの例のみを、あなたはスタートで全体の数字を確認することができます)この事実に注意してください。小数点以下の国では、CDblはドットでうまく動作し、私の例は異なって動作します(コンマで値もフィルタリングされます)。

  • Val

    Strは常に米国の設定(小数点としてドット)を使用します。

  • CDbl,CStrは、地域の設定を考慮に入れます。

リンク: ValWriting International Code

+1

'IsNumeric()'関数は_consciously_で処理する必要があります。例えば、 'IsNumeric(" 1、.23 ")'は 'True'を返すでしょう...だから、私は"サウンド "データ、つまり_real_数字またはテキストを持っていることを知っているときにしか使用しません。 – user3598756

+0

@ user3598756例とこれは単なるエラーハンドラなしで行う方法です。しかし、はい、あなたは正しいとあなたは良い追加を与えるが、質問者があなたが言及したようなものを期待している場合 - それも彼らの世話をするのは簡単です!そして結局のところ、私が言及したように - 尋ね者はそれから始まって、何かを作り上げることができます。私は、特にこの種の問題のために、SOからのコピー/ペーストの回答だけでなく、もっと面白いと思います。 – CommonSense

+0

私はあなたのアプローチが働いていると言っているわけではありません。私はちょうど起こりうる不具合についての警告を追加するだけで、あなたの答えを向上させ、人々がそれを読むのを手助けします。 – user3598756

1

あなたの質問に厳しい答えは以下の通りです:

Option Explicit 

Sub main() 
    Dim dataArray As Variant 
    Dim i As Long, r As Long, intA As Long, intB As Long, intC As Long, intD As Long 

    dataArray = Range("A1:D5").Value 
    r = UBound(dataArray) 
    On Error GoTo SKIP 
    For i = 1 To r 
     If dataArray(i, 1) < 10 Then intA = intA + 1 

     If dataArray(i, 2) < 10 Then 
      intB = intB + 1 
      intC = intC + 1 
      intD = intD + 1 
     End If 
SKIP: 
    Next i 
    ' On Error GoTo 0 '<--| you can comment this out being the last statement since upon exiting the default error handling is resumed 

End Sub 
+0

コメント欄での議論の精神の中で、あなたの提案する「SpecialCells」イディオムも含めることが望ましいでしょう。 –

+0

@ A.S.H、私は大好きですが、実際のデータ構造を持っている方が効果的です – user3598756

+1

@ user3598756ありがとう!ところで、ResumeステートメントでErrの値をリセットする必要はありませんか?私はそうしないと、Errは<> 0のままであり、Errがトリガされず、後続のエラーが捕捉されないことを意味することを思い出してください。 –