You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:36:31