我正在开发一个宏来自动化将大量(数千个)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位。
目前我在宏的开头使用两个用户输入框来设置带有#和前导零的变量,而不是使用find和replace来对两列执行更新。这很好,但必须为文件中的每个数字运行。大多数文件只有一个或两个数字,但有些只有4-5。这也意味着我无法自动完成整个过程,需要有人坐下来为每个文件手动运行宏。
有人关心我指向自动化解决方案的方向吗?我看了其他领先的零解决方案,但它们似乎都只针对数字化的情况。
答案 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