VBA提取Excel带单位数值时报错Invalid Procedure Call Or Argument (Error 5)求助
VBA报错排查及数值提取方案
错误根源定位
你遇到的「invalid procedure call or argument (Error 5)」错误由DeleteUnits函数的逻辑缺陷导致:
- 函数固定执行
Left(value, Len(value) - 3)操作,当传入的单元格内容长度小于3时(比如单元格为空、内容仅1-2个字符),Len(value)-3会得到负数,VBA的Left函数不支持负数长度参数,直接触发报错。 - 额外缺陷:该逻辑仅适配单位刚好占3位的场景,遇到
12g、3.7 吨这类单位长度不符的内容,提取结果也会出错。
代码修复方案
将自定义函数替换为如下版本,可兼容任意长度的单位、自动提取前缀数字:
Sub ExtractNumbers() Dim m As Long For m = 2 To 38 Worksheets("Hoja2").Cells(m, "Q").Value = DeleteUnits(Worksheets("Hoja1").Cells(m, "L").Value) Next End Sub Private Function DeleteUnits(value As String) As Double Dim i As Long ' 遍历找到第一个非数字/小数点的位置 For i = 1 To Len(value) Select Case Mid(value, i, 1) Case "0" To "9", "." Case Else: Exit For End Select Next ' 提取数字部分转成数值,无有效数字返回0 If i > 1 Then DeleteUnits = CDbl(Left(value, i - 1)) Else DeleteUnits = 0 End If End Function
更简便的无代码方案
不需要写VBA,直接用Excel公式即可实现需求,在Hoja2的Q2单元格输入对应公式后下拉填充:
- 适用于Excel 365/2021及以上版本:
=TEXTBEFORE(Hoja1!L2," ")*1,按空格拆分取第一段内容直接转成数值 - 全Excel版本通用:
=LOOKUP(9E+307,--LEFT(Hoja1!L2,ROW($1:$99))),自动提取前缀的所有数字内容,适配单位与数字有无空格、单位长度任意的场景
内容的提问来源于stack exchange,提问作者vbabeginner
相关产品推荐
相关产品推荐

