使用On Error语句删除Table行时如何记录问题记录


Sub FilterRows(Field As String, Values As Collection)
Dim FinalRow As Long
Dim KeepValue As Variant
Dim Table As ListObject
Dim TableRange As Range
Dim i As Integer
With Worksheets("原始資料")
FinalRow = .Cells(Rows.Count, 1).End(xlUp).row

On Error GoTo ErrorHandler
Set Table = .ListObjects("Table1")
Set TableRange = Table.Range

For i = TableRange.Rows.Count To 1 Step -1
For Each KeepValue In Values
If Intersect(TableRange.Rows.Item(i), Table.ListColumns(Field).Range).Value <> 
CStr(KeepValue) Then
TableRange.Rows.Item(i).Delete
End If
Next KeepValue
Next

End With
Exit Sub
ErrorHandler:
Debug.Print Err.Number; ":" & Err.Description
If Table Is Nothing Then
Worksheets("原始資料").ListObjects.Add(xlSrcRange, Worksheets("原始資料").Range("A1:AK" & 
FinalRow), , xlYes).Name = "Table1"
Set Table = Worksheets("原始資料").ListObjects("Table1")
Else
Debug.Print "Error Record ID:" & Intersect(TableRange.Rows.Item(i), 
Table.ListColumns("Record ID").Range).Value<===I'm not able to do This Line...
End If
Resume Next
End Sub

嗨的人,此代码的目的是根据条件删除表行。

在删除过程中,我在某些表行中得到了错误,我想知道哪一行是失败的。所以我写了这句话:"调试。打印"错误记录ID":";,Intersect(TableRange.Rows.Item(i), Table.ListColumns("Record ID"). range). value " .

可能存在变量作用域问题,但我不知道如何将变量传递给Errorhandler。或者有其他好的方法来实现我想做的事情?

谢谢!

在测试代码时,最好不要让错误处理程序处理您的问题,而是让运行时引擎在抛出错误的行处立即停止。您可以通过注释掉On Error Goto行来实现这一点,或者转到VBA选项并选择"Break on all error "(在常规选项卡中)。

变量的作用域是整个子程序,所以这应该不是问题。

应该使用错误处理程序只捕获意外错误。如果表不存在,定义表的逻辑应该在赋值变量时完成:

On Error Resume Next
Set Table = .ListObjects("Table1")
On Error GoTo ErrorHandler
If table Is Nothing Then
With Worksheets("原始資料")
Set table = .ListObjects.Add(xlSrcRange, .Range("A1:AK" & FinalRow), , xlYes)
End With
table.Name = "Table1"
End If    
Set TableRange = Table.Range

我几乎可以肯定你的问题行是1:你不能删除表的标题行。

最新更新