VBA运行报Error 13类型不匹配,添加Option Explicit无高亮求排查
错误排查结果
Error 13: Type Mismatch为类型不匹配错误,你的代码存在以下几个触发该错误的问题:
- 字符串拼接逻辑错误
代码行Set newWS = mainWB.Worksheets(accHolder + "-" + randNumber)存在两处问题:
- VBA中
+号优先做算术运算,拼接字符串应当用&符号 randNumber是Long数字类型,直接和字符串拼接会触发类型不匹配,需要先转成字符串格式
此外你没有判断工作表是否存在,直接引用不存在的工作表也会触发错误,修改参考:
Dim sheetName As String sheetName = accHolder & "-" & CStr(randNumber) ' 先判断工作表是否存在,不存在则新建 Dim ws As Worksheet, sheetExist As Boolean sheetExist = False For Each ws In mainWB.Worksheets If ws.Name = sheetName Then sheetExist = True Set newWS = ws Exit For End If Next If Not sheetExist Then Set newWS = mainWB.Worksheets.Add(after:=mainWB.Worksheets(mainWB.Worksheets.Count)) newWS.Name = sheetName End If- 字符串拼接逻辑错误
- 单元格值赋值未做类型校验
TranstactDate = mainWS.Cells(1, 2):你定义TranstactDate为字符串类型,如果对应单元格是错误值、日期格式值,直接赋值会报错,修改为TranstactDate = CStr(mainWS.Cells(1, 2))AmountExcl = mainWS.Cells(mainR, 3):你定义AmountExcl为Single数值类型,如果对应单元格是空值、文本、错误值,赋值会报错,修改为:If IsNumeric(mainWS.Cells(mainR, 3)) Then AmountExcl = CSng(mainWS.Cells(mainR, 3)) Else ' 不符合格式的行直接跳过 GoTo exitthis End If
- While循环逻辑错误
你的While循环内没有递增mainR变量,只要条件满足就会进入死循环,同时如果mainWS.Cells(mainR, 1)是错误值,执行Left函数也会触发类型不匹配,修改参考:
' 先判断单元格是否为错误值 If IsError(mainWS.Cells(mainR, 1)) Then GoTo exitthis accHolder = Left(mainWS.Cells(mainR, 1), 3) ' 这里修改While逻辑,每次循环递增mainR While mainR <= 1000 And Not IsError(mainWS.Cells(mainR, 1)) And Left(mainWS.Cells(mainR, 1), 3) = accHolder ' 原有写入单元格逻辑不变 ' 最后新增行递增 mainR = mainR + 1 newR = newR + 1 Wend ' 因为While里已经加了mainR,这里要减1抵消For循环的自动递增,避免跳行 mainR = mainR - 1- While循环逻辑错误
- 排序范围未指定所属工作表
最后排序代码里的Range没有指定属于newWS,如果当前活动表不是目标工作表,就会出现范围不匹配的错误,修改为:
With newWS.Sort .SortFields.Add Key:=newWS.Range("C2"), Order:=xlAscending .SetRange newWS.Range("A2:G1000") .Header = xlNo .Apply End With- 排序范围未指定所属工作表
- 空对象判断缺失
如果你的For循环没有匹配到任何有效行,newWS会一直是空对象,后续执行写表头、排序的代码时会触发类型不匹配,应该在写表头前新增判断:
If newWS Is Nothing Then Exit Sub- 空对象判断缺失
内容的提问来源于stack exchange,提问作者KyleStranger
相关产品推荐
相关产品推荐

