如何更正Excel中Worksheet_Change Sub的VBA中的ByRef不匹配错误?

g6ll5ycj  于 2023-04-13  发布在  其他
关注(0)|答案(1)|浏览(157)

我正在尝试自动化一个过程,目前涉及单击Excel工作表上的一个名为“修复UPC”的按钮。该按钮查看文本格式的字符串,看看它是否为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块来检查列字母,因为对不同的列进行了一些其他修改。

2fjabf4q

2fjabf4q1#

字符串的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
关于使用列字母或数字的争议,这取决于调试代码的人的技能。它们是相似的,我也喜欢使用列号,但使用它的字母可能更有说服力,为一个不太熟练的操作员试图理解和调试代码...

相关问题