VBA调用子过程传参触发ByRef Type Mismatch报错如何解决?
错误原因及修复方案
- 第一个触发
ByRef Type Mismatch的原因:forLoop过程中循环变量i未显式声明类型,VBA默认将其识别为Variant类型,和Fetch_data要求的Integer参数类型不匹配,仅加ByVal但不修正变量类型依然会触发类型不匹配错误。 - 第二个核心逻辑错误:
Fetch_data过程中sht变量的声明和赋值逻辑错误:- 你将
sht声明为String字符串类型,却用仅适用于对象赋值的Set关键字赋值,基础类型赋值不需要Set - 后续直接调用
sht.Range不符合语法,字符串变量没有Range属性,你需要把sht声明为Worksheet工作表对象,再关联到对应名称的工作表。
- 你将
修复后的完整代码
forLoop子过程
Public Sub forLoop() ' 显式声明i的类型为Integer,和参数要求匹配 Dim i As Integer For i = 1 To 3 Call Fetch_data(i) Next i End Sub
Fetch_data子过程
Sub Fetch_data(ByVal num As Integer) Dim myCellValue As Range Dim myCellValue1 As Range Dim sht As Worksheet ' 声明为工作表对象类型 ' 给对象变量赋值用Set,关联到对应名称的工作表 Set sht = ThisWorkbook.Worksheets("mySheet" & num) Set myCellValue = sht.Range("J6") Set myCellValue1 = sht.Range("J8") myCellValue1.Value = myCellValue.Value End Sub
额外优化建议
建议在所有VBA模块的第一行加上Option Explicit,强制要求所有变量必须显式声明,能提前规避绝大多数类型不匹配、变量名拼写错误的问题。
内容的提问来源于stack exchange,提问作者Steve Kush
相关产品推荐
相关产品推荐

