我正在开发一个宏,以自动化将大量(数千) 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位的长度。
目前,我正在使用宏开头的两个用户输入框来设置函数#和前导零的变量,而不是使用查找和替换来对这两列执行更新。这很好,但必须对文件中的每个数字运行。大多数文件只有一个或两个数字,但有些文件有4-5号。这也意味着我不能自动化整个过程,需要有人坐下来为每个文件手动运行宏。
有人愿意给我指出一个自动化解决方案的方向吗?我看了其他领先的零解,但它们似乎都是针对数字的情况。
发布于 2014-08-08 05:01:40
我现在有解决办法了。特别感谢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发布于 2017-09-05 11:14:35
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 Subhttps://stackoverflow.com/questions/25171986
复制相似问题