首页 > 解决方案 > 将前导零/文本添加到 VBA 中的字母数字列

问题描述

我正在使用区域 ID 为也具有唯一 ID 的工人创建特定过滤器,这些 ID 由 DB 自动生成,其中第一个数字是特定于员工的,然后是区号,其中一些是整数和其他字符串。

例如:

981505 '9815 is employee id and 05 his area
1340A '134 is employee and 0A his area (aphanumeric are managers)

对于数字数据我没有问题,.NumberFormat = "00####"但对于字母数字我不能应用相同的逻辑,我试过做一个 IF:

If Len(pd.Range("C2:C" & fi).Value) < 10 And pd.Range("C2:C" & fid).Value Then
    pd.Range("C2:C" & fid).Value = WorksheetFunction.Rept("0", 9 - Len(pd.Range("C2:C" & fid).Value))
End If

并且使用 VBA 也会WorksheetFunction返回not optional错误:

pd.Range("C2:C" & fid).Value = WorksheetFunction.Text("00########")

我需要的:

00981505 'Lead zeros
0001340A 'I need lead zeros for future records as id's fluctuate a lot ( i don't know what process goes in the DB for the ids 

为了速度和要求,我需要在 VBA 中完成,有什么帮助吗?

标签: excelvba

解决方案


我认为解决此问题的最简单方法是忽略特定于类型的函数并利用更动态的东西,例如:

Dim endRow as long

endRow = pd.range("C" & Rows.Count).End(xlUp).Row

For fid = 2 to endRow
    If Len(pd.Range("C" & fid)) < 10 Then
        Do
            pd.Range("C" & fid) = "'0" & pd.Range("C" & fid)
        Loop Until Len(pd.Range("C" & fid)) = 10
    End if
next fid

无论其原始类型如何,这都会将您的值留在 C 列中。

编辑:

您在尝试应用相同逻辑时看到错误的原因是您不能采用大于 1 个单元格的范围值并对其应用 Len() 之类的函数。一旦它不止一次的单元格,它的类型严格来说是一个范围并且范围没有 Len(),它会抛出一个不匹配错误。


推荐阅读