我正在尝试自动化一个过程,目前涉及单击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
块来检查列字母,因为对不同的列进行了一些其他修改。
1条答案
按热度按时间2fjabf4q1#
字符串的
Len
返回你需要的。但是数字的Len
返回不同的...因此,最好声明函数参数
deleteCheckDigit(theUPC As String)
,并将其称为转换参数,如deleteCheckDigit(CStr(theValue))
,以确保将String
发送到函数。ALWAYS分别声明所有使用的变量也是很好的:
这样做并在模块顶部使用
Option Explicit
,如果错误地出现错字,你会被警告。比如theVal
。在这种情况下,你可以调用像deleteCheckDigit(theValue)
这样的函数,theValue
已经被转换为String
。关于使用列字母或数字的争议,这取决于调试代码的人的技能。它们是相似的,我也喜欢使用列号,但使用它的字母可能更有说服力,为一个不太熟练的操作员试图理解和调试代码...