Vba 将数据存储到数组时很容易出现 for 循环错误

Vba for loop bugging easily when you store data into an array

我有一个 Vba for 循环,使用自动过滤器然后将数据存储到数组中。下面标记的部分通常会在循环几次后出错,提示“未找到单元格”,然后在重新运行几次或插入消息框后再次运行。有什么建议可以使它 运行 从头到尾没有窃听吗?

For Each C In rng1.SpecialCells(xlCellTypeVisible).Rows
  With rng2
  .AutoFilter field:=9, Criteria1:=C.Columns(4)
  .AutoFilter field:=12, Criteria1:=C.Columns(5)
  
  DirArray(0) = rng2.SpecialCells(xlCellTypeVisible).Rows(1).Columns(23).Value   <------------------- ERROR STARTS HERE //
DirArray(1) = rng2.SpecialCells(xlCellTypeVisible).Rows(1).Columns(24).Value

Set rng3 = rng2.SpecialCells(xlCellTypeVisible).Rows(1).Columns(1)
  Set rng4 = rng2.SpecialCells(xlCellTypeVisible).Rows(1).Columns(1).End(xlDown).End(xlToLeft)
  
  
  
  
      For Each i In x.Sheets("Sheet1").Range(rng3, rng4).Rows
       If i.Columns(24) - i.Columns(23) > DirArray(1) - DirArray(0) Then
        DirArray(0) = i.Columns(23).Value
        DirArray(1) = i.Columns(24).Value
        DirArray(2) = i.Columns(39).Value
        DirArray(3) = i.Columns(40).Value
        DirArray(4) = i.Columns(20).Value
       End If
    
     Next i
    
   C.Columns(15).Value = DirArray(2
End With 
Next C

我假设当应用自动筛选导致 rng2 中没有单元格可见时,它在循环中失败。 SpecialCells(xlCellTypeVisible) 没有单元格时会报错,不能直接测试

您在设置“尝试”使用范围的自动过滤器后添加了一个测试,如果测试通过,则将循环的其余部分包装在 if 语句中。例如:

For Each C In rng1.SpecialCells(xlCellTypeVisible).Rows
  With rng2
    .AutoFilter field:=9, Criteria1:=C.Columns(4)
    .AutoFilter field:=12, Criteria1:=C.Columns(5)
  
    Set lngTest = 0
    On Error Resume Next
    Set lngTest = rng2.SpecialCells(xlCellTypeVisible).Count
    On Error Goto 0

    If lngTest > 0 Then

        DirArray(0) = rng2.SpecialCells(xlCellTypeVisible).Rows(1).Columns(23).Value   
        DirArray(1) = rng2.SpecialCells(xlCellTypeVisible).Rows(1).Columns(24).Value
    
        Set rng3 = rng2.SpecialCells(xlCellTypeVisible).Rows(1).Columns(1)
        Set rng4 = rng2.SpecialCells(xlCellTypeVisible).Rows(1).Columns(1).End(xlDown).End(xlToLeft)         
      
        For Each i In x.Sheets("Sheet1").Range(rng3, rng4).Rows
             If i.Columns(24) - i.Columns(23) > DirArray(1) - DirArray(0) Then
                 DirArray(0) = i.Columns(23).Value
                 DirArray(1) = i.Columns(24).Value
                 DirArray(2) = i.Columns(39).Value
                 DirArray(3) = i.Columns(40).Value
                 DirArray(4) = i.Columns(20).Value
              End If     
          Next i
        
          C.Columns(15).Value = DirArray(2

    End If

  End With 

Next C