使用 VBA 将单词与数字分开

Åsa*_*Åsa 2 excel vba data-cleaning

我有一个需要清理的地址列表。

目标是在数字前添加一个空格,如下例所示。

16AVCHARLESDAGAULLECS10525             16 Avcharlesdagaullecs 10525
1BDHIPPOLYTEMARQUES                    1 Bdhippolytemarques
20GARRICKSTREET4THFLOOR                20 Garrickstreet 4Thfloor
2109ZAC                                2109 Zac
2-4VANDRIESSTREET4                     2-4 Vandriesstreet 4
5:ETVÄRG.19.E                          5:Etvärg. 19.E
901ACEHIGHENTTOWE9TH233                901 Acehighenttowe 9Th 233
Run Code Online (Sandbox Code Playgroud)

我找到了一个在字母之间放置空格的脚本,但这不是我的目标。这是我到目前为止的代码。它没有给出结果。

Function Add_Spaces(ByVal sText As String) As String
   Dim CharNum As Long
   Dim FixedText As String
   Dim CharCode As Long

   FixedText = Left(sText, 1)

   For CharNum = 2 To Len(sText)
      CharCode = Asc(Mid(sText, CharNum, 1))
      If CharCode >= 65 And CharCode <= 90 Then
         FixedText = FixedText & " " & Mid(sText, CharNum, 1) 'This needs to be rewritten
      Else
         FixedText = FixedText & Mid(sText, CharNum, 1)
      End If
   Next CharNum

   Add_Spaces = FixedText
End Function
Run Code Online (Sandbox Code Playgroud)

你对我如何解决这个问题有任何想法吗?

这是正则表达式的一个解决方案,可能会给出一个线索:R 将字符串中的单词与数字分开

Ron*_*eld 6

这似乎适用于您的所有示例:

正则表达式根据从数字到字母的变化进行拆分,反之亦然,并且还对TH.

这些异常可能会导致其他数据出现问题,但似乎适用于您提供的内容。你的可变性是否会成为一个问题是未知的。

请注意,我对 Regex 使用了早期绑定(工具/参考集以包含 Microsoft VBScript 正则表达式 5.5),但如果您要分发此代码,则可以将其更改为后期绑定。

编辑: 请注意,我没有将其转换为正确的大小写,但如果确实需要,可以这样做

`Set Reference to Microsoft VBScript Regular Expressions 5.5
Option Explicit
Function replacer(s As String) As String
    Dim RE As RegExp
    Const sPat As String = "(\dTH|\d)(?!TH)(?=[A-Z])|([A-Z.])(?=\d)"
    Const sRepl As String = "$1$2 "
    Dim sTemp As String
Set RE = New RegExp
With RE
    .Global = True
    .Pattern = sPat
    .IgnoreCase = True
    replacer = .Replace(s, sRepl)
End With

End Function
Run Code Online (Sandbox Code Playgroud)

公式将是,例如:

A2: =replacer(A2)
Run Code Online (Sandbox Code Playgroud)

如果PROPER需要大小写,则将公式更改为:

A2: =PROPER(replacer(A2))
Run Code Online (Sandbox Code Playgroud)

在美国,这似乎比 VBAStrConv函数对您的数据更有效。

在此处输入图片说明