试图提高我的VBA代码的质量和效率

时间:2019-05-06 04:50:22

标签: excel vba switch-statement excel-2007

我有50,000个名称和地址字符串,每个字符串占用一个单元。为了将单元格拆分为不同的名称,街道编号,街道,城市等,我试图将这些单元格拆分为与街道编号和或街道名称匹配的列。

  • 单元格示例均在E列中:

      

    Row Col:E

         
        
    1. 分开。约翰斯顿台地(Keyham Road)咸咸道56号
    2.   
    3. 伍尔斯利路90号和92号
    4.   
    5. 2个安斯利梯田
    6.   
    7. Dyer&Cleaner摩德路10和12号
    8.   
    9. 亚历山大路48b
    10.   
    11. 奶农斯特拉瑟姆修道院路
    12.   
  • NewCell结果在列中

      

    行。上校| G栏| H。

         
        
    1. 分开。| 56 |约翰斯顿露台Keyham Road
    2.   
    3. '*'| 90&92 |伍尔斯利路
    4.   
    5. '*'| 2 |安斯利露台(Ainslie Terrace)
    6.   
    7. 干燥剂和清洁剂| 10和12 |黄金山路
    8.   
    9. '*'| 48b |亚历山大路
    10.   
    11. 奶牛场| '*'|斯特拉瑟姆修道院路
    12.   

目前,我的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

2 个答案:

答案 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语句,因为它会隐藏错误,但仍然会发生。

希望您最终可以对此进行编码,或者至少找到有用的答案。

但是无论如何,您仍然需要编写很多代码。