VBA编译错误ByRef Argument Type Mismatch(myQuarterNo)问题求助
错误原因
- 传参数量不符:
QuarterName函数定义要求传入2个必填参数(整数类型的季度、整数类型的年份),但调用时仅传入了myQuarterNo一个参数,不符合函数调用规则。 - 参数类型不匹配:全局声明的
myQuarterNo是String字符串类型,但QuarterName要求第一个入参为Integer整数类型,VBA默认按地址传递(ByRef)时要求变量类型完全一致,因此触发类型不匹配报错。 - 函数功能与需求不匹配:当前
QuarterName函数返回的是Invoice表的日期过滤SQL语句,并非你需要的「Quarter1~Quarter4」格式的季度标识文本。
解决方案
步骤1:修改QuarterName函数
调整函数逻辑,支持返回你需要的季度标识,同时兼容原有的SQL条件返回能力:
Option Compare Database Option Explicit Public Function QuarterName(varQuarter As Integer, Optional varYear As Integer = 0) As String ' 未传入年份时返回QuarterX格式的季度标识 If varYear = 0 Then QuarterName = "Quarter" & varQuarter Exit Function End If ' 传入年份时返回日期过滤SQL语句 Dim strDateString As String Select Case varQuarter Case 1 strDateString = " [Invoices].[TransactionDate] Between #01/01/" & varYear & "# AND #03/31/" & varYear & "# " Case 2 strDateString = " [Invoices].[TransactionDate] Between #04/01/" & varYear & "# AND #06/30/" & varYear & "# " Case 3 strDateString = " [Invoices].[TransactionDate] Between #07/01/" & varYear & "# AND #09/30/" & varYear & "# " Case 4 strDateString = " [Invoices].[TransactionDate] Between #10/01/" & varYear & "# AND #12/31/" & varYear & "# " End Select QuarterName = strDateString End Function
步骤2:修改调用处代码
首先删除Detail_Format过程中重复声明的Dim myYear As Integer(重复声明会覆盖全局变量),再修正传参逻辑:
' 读取季度值后转成整数传入函数 myQuarterNo = [Forms]![frmQuarterlyExciseInput]![cboquarter] myQuarterName = QuarterName(CInt(myQuarterNo)) myYear = [Forms]![frmQuarterlyExciseInput]![cboCurrentYear] Me.txtQuarterName = myQuarterName Me.txtYear = myYear
可选校验逻辑
如果cboquarter存在空值或非数字选项,可在调用前增加校验避免转换报错:
If Not IsNumeric([Forms]![frmQuarterlyExciseInput]![cboquarter]) Then MsgBox "请先选择合法的季度值" Exit Sub End If myQuarterNo = [Forms]![frmQuarterlyExciseInput]![cboquarter] ' 后续逻辑不变
内容的提问来源于stack exchange,提问作者Eirsha
相关产品推荐
相关产品推荐

