Vba Excel宏用于不同条件下的前导零

Vba Excel宏用于不同条件下的前导零,vba,excel,Vba,Excel,我正在开发一个宏,以自动将大量(数千)excel工作簿准备为标准格式,以便导入数据库 一个问题是在一些数字/字母组合中添加前导零 目前我有一个临时解决方案,但它的一个关键缺点是需要用户通过对话框输入来处理该过程。我的目标是最终以vbs的形式从命令行运行宏 在我看来,我拥有的条件相当普通,但如何创建宏代码来处理它却让我感到困惑。在导入工作流期间,在Access中实现它可能会更好。然而,拥有正确格式的excel文件还有额外的好处,这也是为什么我决定采用宏解决方案的原因 有两列需要操作,宏将它们都设置

我正在开发一个宏,以自动将大量(数千)excel工作簿准备为标准格式,以便导入数据库

一个问题是在一些数字/字母组合中添加前导零

目前我有一个临时解决方案,但它的一个关键缺点是需要用户通过对话框输入来处理该过程。我的目标是最终以vbs的形式从命令行运行宏

在我看来,我拥有的条件相当普通,但如何创建宏代码来处理它却让我感到困惑。在导入工作流期间,在Access中实现它可能会更好。然而,拥有正确格式的excel文件还有额外的好处,这也是为什么我决定采用宏解决方案的原因

有两列需要操作,宏将它们都设置为文本格式

A列是建筑编号,长度必须为4位数字。目前,它们的格式没有前导零。有些建筑物的数字后面有一个或多个字母

一些示例:
7
76
399
1010

一些带有字母:
76A
93B
812W

还有一些更为古怪:
76A-G
812A-S

这些需要重新格式化为前导零,因此:
0076A-G
0007
1000A
,等等

B列是一个申请编号,性质与a列几乎相同,但有额外的细节:
76-X-001
76A-X-023
76A-X-R-005
。这些需要变成
0076-X-001
,等等。只有第一个“-”之前的数字需要前导零,长度也要达到4位

目前,我在宏的开头使用了两个用户输入框来设置变量,其中包含facility#和前导零,而不是使用find和replace对两列执行更新。这很好,但必须对文件中的每个数字运行。大多数文件只有一个或两个数字,但有些文件有4-5。这也意味着我无法自动化整个过程,需要有人坐下来手动运行每个文件的宏


有人愿意为我指点一个自动化的解决方案吗?我看了其他领先的零解,但它们似乎都是针对数字的情况。

我现在有了一个有效的解。特别感谢蒂罗伊

Sub Change_Number_Format_In_String()
Dim iFirstLetterPosition As Integer
Dim sTemp As String
For Each c In Range("A2:A100")
   If Len(c) > 0 Then
    iFirstLetterPosition = Evaluate("=MATCH(TRUE,NOT(ISNUMBER(1*MID(" & c.Address & ",ROW($1:$20),1))),0)")
    sTemp = Left(c, iFirstLetterPosition - 1) 'get the leading numbers
    sTemp = Format(sTemp, "0000") 'format the numbers
    sTemp = sTemp & Mid(c, iFirstLetterPosition, Len(c)) 'concatenate the remainder of the string
    c.NumberFormat = "@"
    c.Value = sTemp
End If
Next
End Sub
对于A列

=RIGHT("0000"&A1,4)
对于B列

=RIGHT("0000"&LEFT(B1,FIND("-",B1,1)),5)&MID(B1,FIND("-",B1,1)+1,LEN(B1))
要在整个范围内执行此操作,请执行以下操作:

Sub TestFormatNumbers()
    Dim wsMaster As Worksheet
    Dim rgCellsToFormat As Range

    Set wsMaster = ActiveSheet
    Set rgCellsToFormat = wsMaster.Range("A1:A100")

    With rgCellsToFormat
        .NumberFormat = "@"
        .Value = Evaluate("=IF(ISTEXT(" & _
            .Address & "),RIGHT(""0000""&LEFT(" & _
            .Address & ",FIND(""-""," & .Address & ",1)),5)&RIGHT(" & _
            .Address & ",LEN(" & .Address & ")-FIND(""-""," & _
            .Address & ",1)),"""")")
    End With
End Sub

似乎是正则表达式的工作,你可以通过包含VBScript扩展来获得。我不确定我是否理解你只需要4位数字的要求。其中一些已超过4个字符。我想你需要4个数字加上任何字母都可以保持原样。您应该能够将字符串读入字符串数组,如有必要,以“-”分隔,计算原始数组长度,仅计算数字,重拨数组使其成为四位数字加字母。最后,根据原始字符串长度,填充必要的0数。