【发布时间】:2019-09-23 17:16:06
【问题描述】:
我有 50,000 个姓名和地址字符串,每个字符串占用一个单元格。为了将单元格拆分为不同的名称、街道编号、街道、城市等,我试图将单元格拆分为与街道编号和街道名称匹配的列。
-
E列中的所有单元格示例:
行列:E
- 分开。 56 Johnston Terrace Keyham 路
- 沃尔斯利路 90 号和 92 号
- 2 安斯利露台
- Dyer & Cleaner 10 & 12 Mount Gold Road
- 亚历山大路 48b 号
- 奶农斯特拉瑟姆修道院路
-
NewCell 列中的结果;
行。 Col.F |上校 | Col.H
- 分开。| 56 | Johnston Terrace Keyham 路
- '*' | 90 & 92 |沃尔斯利路
- '*' | 2 |安斯利露台
- 染色剂和清洁剂 | 10 & 12 |金山路
- '*' | 48b |亚历山大路
- 奶农 | '*' |斯特拉瑟姆修道院路
目前我的Excel Sheet没有具体的列名,只有A;乙; 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
【问题讨论】:
-
在处理此类数据时,您应该考虑使用数组,您的代码会大大加快速度。我会给你举个例子,但是因为你只展示了蒂姆写的地址部分是好的。
-
嗨 Damian 感谢 cmets。正如您从我对 Tim 的评论中看到的那样,我使用他的代码得到了一个编译错误。我将编辑我的帖子以包含我正在处理的典型单元格条目。
-
我已经处理过此类数据,我认为实际上,如果您可以编写一个可以提取所需数据的代码,那么单独的代码将足够复杂,让您感到困难,您的优先级应该是实际的逻辑,而不是效率,因为我相信你只需要运行几次
-
好吧@usmanhaq OP 说他的代码可以工作,但是太慢了,所以现在他的逻辑至少没问题,他可以专注于优化。
-
@DJP2019 与您提供的示例一样,您无法做到这一点......您的输入没有模式。您真的设法通过这些输入获得输出吗?如果至少总是有街道号码,你可以做到一半(取城市会有点复杂),但有些情况下你没有号码......你如何检测它是街道名称还是名称?
标签: excel vba switch-statement excel-2007