2017-10-13 105 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块中使用它。其次,在计算最后一行时出现了一个小错误。 range未被明确引用,因为该表可能是宏运行时活动的任何表单。 With块现在就处理这个问题。
最后,如果多次使用中间值并存储函数调用会更经济。它使代码更具可读性。
编辑:
A On Error Goto语句激活错误处理例程。如果我们在这里使用它,第二个运行时错误不会被忽略。相反,使用On Error Resume Next只是跳过下一个可能的违规行。所有#N/A字段现在被忽略。

+0

谢谢你的帮助。我喜欢你如何修改它现在看起来好多了的代码。但我有一个问题。代码类型的作品,但它跳过#N/A之后,它错误地在下一个,并说类型不匹配。尽管我可以看到它已经跳过了一个。也许我只是在那个我不记得的单元格里输入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

谢谢!我首先尝试了其他的答案,但它仍然停止了错误。这只是跳过他们,并继续前进!完善!非常感谢你! – Robillard