如何纠正Excel中Worksheet_Change子表的VBA中的ByRef不匹配错误?



我正在尝试自动化一个过程,目前涉及点击一个名为" Fix UPC" Excel工作表上的按钮。此按钮查看文本格式的字符串是否为12个字符长,如果是,它将删除最后一个数字,然后将数字格式设置为"0-00000-00000"。本页将处理的绝大多数upc都遵循UPC-A标准,但像许多系统一样,我们的系统忽略了最后一个校验数字,因此需要将其修剪为11,以便VLOOKUP能够正常工作。一些遵循13位EAN标准,所以这些需要保持完整。

现在我有以下函数位于一个名为Helpers的模块:

Public Function deleteCheckDigit(theUPC) As String
If Len(theUPC) = 12 Then
deleteCheckDigit = Left(theUPC, 11)
Else
deleteCheckDigit = theUPC
End If
End Function

工作表上的私有子表是:

Private Sub Worksheet_Change(ByVal Target As Range)
theCol = Helpers.GetColumnFromAddress(Target.Address)
theValue = Range(Target.Address).Value

If theCol = "A" Then
If Len(theValue) = 12 Then
Target.Value = Helpers.deleteCheckDigit(theValue)
Range(Target.Address).NumberFormat = "0-00000-00000"
End If
End If
End Sub

当我输入UPC并按enter键时,Excel抛出一个编译错误,说明ByRef argument type mismatch。我测试了VarType(theValue),它返回8意味着它是一个字符串,所以我没有看到是什么导致这个错误。

注意:我设置了一个If/Then块来检查列字母,因为有一些其他的修改正在对不同的列进行。

字符串的Len返回您需要的内容。但是一个数字的Len返回不同的…

因此,最好声明函数形参deleteCheckDigit(theUPC As String),并调用它强制转换实参如deleteCheckDigit(CStr(theValue)),以确保将String发送给函数。

ALWAYS分别声明所有使用的变量:

Dim theCol As Sring
Dim theValue As String

这样做并在模块上使用Option Explicit,如果错误地出现错字,则会警告您。比如theVal。在这种情况下,你可以调用函数deleteCheckDigit(theValue),theValue已经转换为String

关于使用列字母或数字的争议,这取决于调试代码的人的技能。它们是相似的,我也更喜欢使用列号,但是对于一个试图理解和调试代码的不太熟练的操作员来说,使用它的字母可能更有说服力…

最新更新