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
我有一个 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