按教程删除Excel表格空单元格时触发Type Mismatch错误,求排查
解决VBA删除Excel表格空行的类型不匹配错误
错误根源
你将变量row声明为ListRow类型,但rng.Rows返回的是Range对象的行集合,两种类型不兼容,直接导致Type Mismatch错误。
修正方案
有两种规范的修正方式,同时需要注意:删除行必须用倒序遍历,否则删除行后后续行索引前移,会漏判部分行;另外要先判断表格是否有数据(DataBodyRange不为空),避免空表格报错。
方案1:修正变量类型,结合Range遍历
Dim ws As Worksheet Dim tbl As ListObject Dim rng As Range Dim row As Range Dim i As Long Set ws = ThisWorkbook.Sheets("RawIPs") For Each tbl In ws.ListObjects Set rng = tbl.DataBodyRange ' 先判断表格是否有数据 If Not rng Is Nothing Then ' 倒序遍历行 For i = rng.Rows.Count To 1 Step -1 Set row = rng.Rows(i) If Application.WorksheetFunction.CountA(row) = 0 Then ' 用ListRow删除表格行更符合表格对象操作逻辑 tbl.ListRows(i).Delete End If Next i End If Next tbl
方案2:直接遍历ListRow(更贴合Excel表格对象)
Dim ws As Worksheet Dim tbl As ListObject Dim lstRow As ListRow Dim i As Long Set ws = ThisWorkbook.Sheets("RawIPs") For Each tbl In ws.ListObjects If Not tbl.DataBodyRange Is Nothing Then ' 倒序遍历表格的ListRows集合 For i = tbl.ListRows.Count To 1 Step -1 Set lstRow = tbl.ListRows(i) If Application.WorksheetFunction.CountA(lstRow.Range) = 0 Then lstRow.Delete End If Next i End If Next tbl
关键注意事项
- 类型匹配:
ListRow是Excel表格(ListObject)的行对象,Range.Rows是普通单元格区域的行对象,两者不能混用遍历 - 倒序遍历:删除行操作会改变后续行的索引,正序循环会导致部分行被跳过
- 空值判断:表格没有数据时
DataBodyRange为Nothing,直接操作会触发错误
内容的提问来源于stack exchange,提问作者Styles2304
相关产品推荐
相关产品推荐

