Excel VBA循环排除指定工作表时出现类型不匹配错误求助
Excel VBA循环排除指定工作表的错误修复
错误根源分析
原代码的核心问题有两个:
Set ws = Application.Worksheets.Count是完全错误的写法:Worksheets.Count返回的是数值类型的工作表总数,而ws定义的是Worksheet对象,用Set(对象赋值关键字)把数值赋值给对象,直接触发「类型不匹配」错误。- 变量
a未定义也未赋值,循环范围For i = 1 To a无意义;且循环内判断的ws.Name和当前遍历的Worksheets(i)完全无关,逻辑混乱。
修正方案1:直接遍历工作表对象(推荐)
这种写法更直观,无需处理索引,直接对每个工作表对象做判断:
Dim ws As Worksheet ' 遍历所有工作表 For Each ws In ThisWorkbook.Worksheets ' 排除指定名称的工作表 If ws.Name <> "BoQ" And ws.Name <> "Sign Off Sheet" And ws.Name <> "PIANOI" Then ws.Cells(46, 14).Formula = "=Frontsheet!J10" ws.Cells(46, 16).Formula = "=Frontsheet!J9" End If Next ws
修正方案2:按索引遍历工作表
如果习惯用索引遍历,需要正确获取每个索引对应的工作表对象:
Dim i As Integer Dim wsCount As Integer wsCount = ThisWorkbook.Worksheets.Count For i = 1 To wsCount ' 获取当前索引对应的工作表对象 With ThisWorkbook.Worksheets(i) If .Name <> "BoQ" And .Name <> "Sign Off Sheet" And .Name <> "PIANOI" Then .Cells(46, 14).Formula = "=Frontsheet!J10" .Cells(46, 16).Formula = "=Frontsheet!J9" End If End With Next i
额外注意事项
- 建议使用
ThisWorkbook代替Application或直接写Worksheets,明确指向当前代码所在的工作簿,避免误操作其他打开的工作簿。 - 在模块顶部添加
Option Explicit,强制所有变量提前定义,能避免因未定义变量导致的隐性错误。
内容的提问来源于stack exchange,提问作者Geographos
相关产品推荐
相关产品推荐

