用于具有不同条件的前导零的Excel宏

时间:2014-08-06 23:34:32

标签: excel vba excel-vba

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

一个问题是将前导零添加到某些数字/字母组合中。

我现在有一个临时解决方案,但它有一个关键错误,它需要用户通过对话框输入来处理程序。我的目标是最终从命令行运行宏作为vbs。

在我看来,我所拥有的条件相当普通,但我对如何创建处理它的宏代码感到困惑。也许在导入工作流程中更好地在Access中实现。但是,使用正确格式的excel文件会带来额外的好处,也是我决定采用宏解决方案的原因。

有两列需要操作,两者都由宏设置为文本格式。

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

一些示例:7763991010

有些字母:76A93B812W

有些人很奇怪:76A-G812A-S

这些需要重新格式化,以便有前导零:0076A-G00071000A等。

B列是一个归档编号,在性质上几乎与A列相同,但附加详细信息:76-X-00176A-X-02376A-X-R-005。这些需要成为0076-X-001等。只有第一个' - '之前的数字。需要前导零,长度为4位。

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

有人关心我指向自动化解决方案的方向吗?我看了其他领先的零解决方案,但它们似乎都只针对数字化的情况。

2 个答案:

答案 0 :(得分:0)

我现在有了一个有效的解决方案。特别感谢Teeroy。

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

答案 1 :(得分:0)

对于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