VBA删除行报错类型不匹配:If Not Is Nothing逻辑使用问题
你的VBA代码问题分析与修正
让我帮你拆解这段代码里的几个关键问题,它们正是导致你遇到两个异常的原因:
1. 单元格非空判断逻辑错误
你用Not Cells(i, 10) Is Nothing来判断第10列是否有内容,这是完全错误的逻辑:
Cells(i,10)是一个Range对象,不管单元格里有没有值,这个对象本身都是存在的,所以Not Cells(i,10) Is Nothing永远返回True。- 这就导致你的判断条件简化成了
Cells(i,13).Value = 0——只要第13列是0,不管第10、11列是否为空,都会执行删除,这就是为什么不该删的行也被删掉了。
正确的非空判断应该检查单元格的值是否为空,比如:
' 检查单元格值不为空(包含空格的话可以加Trim) Cells(i, 10).Value <> "" ' 或者更严谨地检查字符长度(排除空格) Len(Trim(Cells(i, 10).Value)) > 0
2. 从前往后循环删除行导致的索引混乱与类型不匹配错误
当你从第1行到第200行循环删除行时,会出现两个问题:
- 索引错位:删除第i行后,原本的第i+1行会变成新的第i行,但循环变量i会继续递增到i+1,直接跳过了这一行,导致部分符合条件的行没被删除。
- 类型不匹配(错误13):多次执行后,工作表的总行数会减少,当i超过当前实际行数时,访问
Cells(i,13)可能会引用到不存在的单元格,或者单元格里的非数值类型数据(比如文本)和0比较时触发类型不匹配。
解决方法是从后往前循环,这样删除行不会影响未循环到的行的索引:
For i = 200 To 1 Step -1
3. 额外的优化建议
- 不要使用
Activate和Select,直接引用工作表和行,避免激活其他工作表导致的错误; - 用
EntireRow.Delete代替Rows(i).Delete,语义更明确; - 可以加上对第13列数据类型的判断,避免非数值和0比较触发错误。
修正后的完整代码
Option Explicit Sub deletezero() Dim i As Integer Dim ws As Worksheet ' 直接引用目标工作表,避免Activate Set ws = ThisWorkbook.Worksheets("1. Con.SECTORIAL & EMISOR") ' 从后往前循环,避免索引错位 For i = 200 To 1 Step -1 ' 正确判断:第13列是0,且第10、11列不为空(排除空格) If ws.Cells(i, 13).Value = 0 _ And Len(Trim(ws.Cells(i, 10).Value)) > 0 _ And Len(Trim(ws.Cells(i, 11).Value)) > 0 Then ' 直接删除整行,无需Select ws.Cells(i, 1).EntireRow.Delete End If Next i End Sub
内容的提问来源于stack exchange,提问作者Mauro
相关产品推荐
相关产品推荐

