如何确定街道名称或城市是否需要空间?

时间:2017-10-05 23:18:06

标签: sql excel excel-vba vba

问题:我希望能够确定街道名称或城市名称中是否需要空格。

原因是用户习惯将两个单词合二为一。

实施例。在数据库中,"贝尔花园"输入为" BellGardens"。

他们是否可以确定用户何时执行此操作并相应地添加空间?

2 个答案:

答案 0 :(得分:2)

您可以使用正则表达式,here是正则表达式验证测试。

以下是如何做的解释。

  

代码和正则表达式已更新,请到最后检查它们。

Enable Regex on Excel

  1. 打开Excel工作簿。
  2. Alt + F11 打开VBA / Macros窗口。
  3. 工具 下添加对正则表达式的引用,然后 引用
    ![Excel VBA Form add references
  4. 并选择 Microsoft VBScript Regular Expression 5.5
    ![Excel VBA add regex reference
  5. 插入一个新模块(代码需要驻留在模块中,否则它不起作用) ![Excel VBA insert code module
  6. 在新插入的模块中,
    ![Excel VBA insert code into module
  7. 代码

    1. 添加以下代码:

      Sub test_regex()
      
      Dim str As String
      Dim objMatches As Object
      Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets(1)
      Dim i As Long
      
      lastrow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
      'To check the name
      For i = 1 To lastrow
          str = Trim(CStr(Cells(i, 1)))
          Set objRegExp = CreateObject("VBScript.RegExp") 'New regexp
          objRegExp.Pattern = "^(?![ ])(?!.*[ ]{1})(?:([A-Z][a-z]+\s*?)([Mc|O']*[A-Z][a-z]+\s*?)*(?!.*[ ])$)+$"
          objRegExp.Global = True
          Set objMatches = objRegExp.Execute(str)
          If objMatches.Count <> 0 Then
                  ws.Cells(i, 2) = objRegExp.Replace(str, "$1" & " " & "$2")
                  ws.Cells(i, 2).Interior.ColorIndex = 4
          Else
              ws.Cells(i, 2).Interior.ColorIndex = 3
              ws.Cells(i, 2) = ws.Cells(i, 1)
          End If
      Next i
      
      End Sub
      
    2. 结果

      ![Result

      此代码将Trim名称并根据Regex添加空格。仅限2个大写名称,Mc和O'除外

      如果名称与ThIsNaMe类似,则输出将为Th Me

      红色名称中的代码颜色已经正确,绿色代码颜色有一些间距问题。

      Ps。:由于我是Regex的新手,因此有优化空间。

      更新编辑:

      对于更复杂的正则表达式以及超过2个大写字母案例和数字,这里是Regex Update

      代码

      颜色索引是Swapped,因此当颜色为红色时,意味着它已被更改。因此,用户可以直观地验证更改。

      Sub test_regex()
      
      Dim str As String, final_str As String
      Dim objMatches As Object
      Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets(1)
      Dim i As Long, k As Long, lastrow As Long
      
      lastrow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
      'To check the name
      For i = 1 To lastrow
          str = Trim(CStr(Cells(i, 1)))
          Set objRegExp = CreateObject("VBScript.RegExp") 'New regexp
          objRegExp.Pattern = "(?!.*[ ]{1})(?:(?:[Mc|O']*[A-Z]{1}[a-z]+)|(?:[\d]+[rd|th|st|nd]*))"
          objRegExp.Global = True
          Set objMatches = objRegExp.Execute(str)
          If objMatches.Count > 1 Then
                final_str = ""
                For Each m In objMatches
                  final_str = final_str & " " & CStr(m.Value)
                Next
                  ws.Cells(i, 2).Interior.ColorIndex = 3
                  ws.Cells(i, 2) = Trim(final_str)
          Else
              ws.Cells(i, 2).Interior.ColorIndex = 4
              ws.Cells(i, 2) = ws.Cells(i, 1)
          End If
      Next i
      
      End Sub
      

      结果

      ![![![Result2

答案 1 :(得分:0)

你不能这样做,你需要某种模式来自动化,但在你的情况下,不能仅仅通过使用街道名称或城市名称来自动化“空间”。