2017-10-13 6 views
0

私は自分のコードでこのループを実行していますが、AV列のいくつかのセルに#N/Aがあり、エラーが発生しています。残りの部分はこれまでのものと同じですが、#N/Aに当たったら停止します。 IFERRORやISNAのようなものを見つけましたが、私のコードにどのように記述するのか分かりませんでした。私はちょうど#N/Aを無視して、#N/Aをそのまま残して次の行に移動したいだけです。私はちょうどそれをスキップし、コードを続行したい。私はこれでどのようにできるでしょうか?forループでN/Aをスキップする方法をそのままのままにして続けますか?

Dim lngRow As Long 
Dim lngRows As Long 
'Find the last row in Column A 
lngRows = Range("A" & Rows.Count).End(xlUp).Row 

For lngRow = lngRows To 2 Step -1 

     If (LCase(ActiveWorkbook.Worksheets("SAP to ADP").Cells(lngRow, "AV").Value) = "lu" _ 
      Or LCase(ActiveWorkbook.Worksheets("SAP to ADP").Cells(lngRow, "AV").Value) = "st" _ 
      Or LCase(ActiveWorkbook.Worksheets("SAP to ADP").Cells(lngRow, "AV").Value) = "so") _ 
      And LCase(ActiveWorkbook.Worksheets("SAP to ADP").Cells(lngRow, "AU").Value) = "union" Then 
      ActiveWorkbook.Worksheets("SAP to ADP").Cells(lngRow, "AW").Value = "MATCH" 

     End If 

Next 

ありがとうございました!

答えて

0

私はエラーハンドラを使用することをお勧めします。 On Error Gotoステートメントは、エラーが発生した場合にExcelが別のコード行にジャンプするように指示します。これを使用する最も簡単な形式は次のとおりです。

Dim lngRow As Long 
Dim lngRows As Long 
Dim s as String 

With ActiveWorkbook.Worksheets("SAP to ADP") 
    'Find the last row in Column A 
    lngRows = .Range("A" & .Rows.Count).End(xlUp).Row 
    On Error Resume Next    
    For lngRow = lngRows To 2 Step -1 
     s = "" 
     s = LCase(.Cells(lngRow, "AV").Value) 
     If (s = "lu" Or s = "st" Or s = "so") _ 
     And LCase(.Cells(lngRow, "AU").Value) = "union" Then 
      .Cells(lngRow, "AW").Value = "MATCH" 
     End If 
    Next lngRow 
    On Error Goto 0 
End With 

コードには他にも変更があります。まず、ActiveWorkbook.Worksheets("SAP to ADP")をそれぞれ参照するたびに参照を解除する必要はありませんので、Withブロックで使用してください。
第2に、最終行を計算する際にわずかな間違いがありました。 rangeは、そのシート上にあるものとして明示的に参照されていませんでした。マクロが実行された時点でアクティブなシートである可能性があります。 Withブロックがこれを処理します。
最後に、複数回使用する場合は中間値を格納するほうが経済的であり、関数呼び出しにはコストがかかります。コードを読みやすくします。
編集:
On Error Gotoステートメントは、エラー処理ルーチンをアクティブにします。ここで使用すると、2番目のランタイムエラーは無視されません。代わりに、On Error Resume Nextを使用すると、起こりそうな次の行をスキップするだけです。すべての#N/Aフィールドは無視されるようになりました。

+0

ありがとうございました。私はあなたがコードを修正したのが好きです。今はもっと良く見えます。私は問題がある。コードの種類は動作しますが、#N/Aをスキップした後、次のものにバグがあり、型の不一致があります。私はそれが既に1つをスキップすることがわかりますが。たぶん、私は覚えていないセルにN/Aと打ち込んだだけです。しかし、それがエラーをヒットしたら、それは続かないでしょう... – Robillard

+0

また、あなたは中間の値を述べました。それはあなたがそこに置く "s"の価値ですか?私はあなたがそれをどうやってしたのが、それがあなたが意味するものなのか疑問に思っています。 – Robillard

+1

あなたは正しいです、後続のランタイムエラーは捕まえられませんでした。私はコードを変更し、すべてのエラーを無視するようになりました。これは、操作上のコード自体を変更する必要はなく、 'On Error'ステートメントだけを追加することです。そして、はい、小文字のシートから読み込まれた値は複数回使用され、変数 's'に割り当てられます。 – user1016274

1

は、エラーのためにテストを追加します。

Dim lngRow As Long 
Dim lngRows As Long 
'Find the last row in Column A 
lngRows = Range("A" & Rows.Count).End(xlUp).Row 

For lngRow = lngRows To 2 Step -1 
    IF Not IsError(ActiveWorkbook.Worksheets("SAP to ADP").Cells(lngRow, "AV") Then 

     If (LCase(ActiveWorkbook.Worksheets("SAP to ADP").Cells(lngRow, "AV").Value) = "lu" _ 
      Or LCase(ActiveWorkbook.Worksheets("SAP to ADP").Cells(lngRow, "AV").Value) = "st" _ 
      Or LCase(ActiveWorkbook.Worksheets("SAP to ADP").Cells(lngRow, "AV").Value) = "so") _ 
      And LCase(ActiveWorkbook.Worksheets("SAP to ADP").Cells(lngRow, "AU").Value) = "union" Then 
      ActiveWorkbook.Worksheets("SAP to ADP").Cells(lngRow, "AW").Value = "MATCH" 

     End If 
    End If 
Next 
+0

ありがとうございました!私は最初に他の答えを試みたが、それはまだエラーで停止していた。この1つはちょうどそれらの直前をスキップし、行くことを続けた!完璧!どうもありがとうございました! – Robillard

関連する問題