我有50,000个名称和地址字符串,每个字符串占用一个单元。为了将单元格拆分为不同的名称,街道编号,街道,城市等,我试图将这些单元格拆分为与街道编号和或街道名称匹配的列。
单元格示例均在E列中:
Row Col:E
- 分开。约翰斯顿台地(Keyham Road)咸咸道56号
- 伍尔斯利路90号和92号
- 2个安斯利梯田
- Dyer&Cleaner摩德路10和12号
- 亚历山大路48b
- 奶农斯特拉瑟姆修道院路
NewCell结果在列中
行。上校| G栏| H。
- 分开。| 56 |约翰斯顿露台Keyham Road
- '*'| 90&92 |伍尔斯利路
- '*'| 2 |安斯利露台(Ainslie Terrace)
- 干燥剂和清洁剂| 10和12 |黄金山路
- '*'| 48b |亚历山大路
- 奶牛场| '*'|斯特拉瑟姆修道院路
目前,我的Excel工作表没有特定的列名,只有A; B; C等。我有将分隔每个单元格的VBA代码。但是,街道编号和/或街道名称将根据每个单元格中的“ textnumbertext”字符串进行不同的划分。
我有单独的VBA代码,可以在任何以街道编号开头的条目之前添加星号(请参见代码)。然后将每个单元格放在正确的列中(我以后可以删除星号)。但是,我觉得这段代码效率低下,如果我要使用Case函数的话,它可能不会那么冗长。
更复杂的是某些街道编号将为14A或12B或10c或12a。如果我将这些选项添加到下面的代码中,那么一切都会变得很漫长且效率低下。有什么想法吗?
Sub ReplaceFirstNumber()
'If the first character in the string starts with a number between 1-9 THEN
'ADD a * to the string
Dim r As Range
Dim c As Range
On Error Resume Next
Set r = Range(Range("E1"), Range("E" & Rows.Count).End(xlDown))
For Each c In r
If Left(c.Value, 1) = "1" _
Or Left(c.Value, 1) = "2" _
Or Left(c.Value, 1) = "3" _
Or Left(c.Value, 1) = "4" _
Or Left(c.Value, 1) = "5" _
Or Left(c.Value, 1) = "6" _
Or Left(c.Value, 1) = "7" _
Or Left(c.Value, 1) = "8" _
Or Left(c.Value, 1) = "9" Then
c.Value = " * " & c.Value
End If
Next c
End Sub
答案 0 :(得分:0)
下面的功能有望帮助您简化此任务。它将删除地址字符串中的所有数字字符,并将包含任何结尾的单个字母。
Function getnumbersfromstring(address As String) As String
For i = 1 To Len(address)
If IsNumeric(Mid(address, i, 1)) Then getnumbersfromstring = getnumbersfromstring & Mid(address, i, 1)
Next i
CharAfterNumber = Mid(address, Instr(1, address, getnumbersfromstring) + Len(getnumbersfromstring), 1)
If IsNumeric(CharAfterNumber) = False And Not CharAfterNumber = " " And Not CharAfterNumber = "" Then
getnumbersfromstring = getnumbersfromstring & CharAfterNumber
End If
End Function
可以像这样在常规Sub中调用此函数
Sub breakupaddress()
Dim r As Range
Dim c As Range
Dim addressnr As String
On Error Resume Next
Set r = Range(Range("E1"), Range("E" & Rows.Count).End(xlDown))
For Each c In r
addressnr = getnumbersfromstring(c.Value)
MsgBox "The address number is '" & addressnr & "'.", vbInformation, "Information"
Next c
End Sub
答案 1 :(得分:0)
我很好奇您将如何编写所有代码,但是关于您的问题,可能可行的方法是:
Sub ReplaceFirstNumber()
'If the first character in the string starts with a number between 1-9 THEN
'ADD a * to the string
Dim r As Range
Dim c As Range
Set r = Range("E1:E" & Range("E" & Rows.Count).End(xlUp).Row)
For Each c In r
If IsNumeric(Left(c.Value, 1))=True Then c.Value = "*" & c.Value
Next c
End Sub
在代码中,您使用Range(Range("E1"), Range("E" & Rows.Count).End(xlDown))
。这意味着列E中的所有单元格!。这就像Excel 2007或更高版本中的一百万个单元格一样。在我的代码中,范围是Set r = Range("E1:E" & Range("E" & Rows.Count).End(xlUp).Row)
这将仅选择E1和E列中最后一个非空白单元之间的所有单元,因此如果您只有50.000,它将大大缩短执行时间 数据行。
此外,如果您正在学习VBA,我强烈建议您不要使用On Error Resume Next
语句,因为它会隐藏错误,但仍然会发生。
希望您最终可以对此进行编码,或者至少找到有用的答案。
但是无论如何,您仍然需要编写很多代码。