Excel VBA:在字符串中的大写字母后面或前面加空格
我有一系列代表客户名称的文本,但它们在每个单词/名称之间没有空格(例如:JohnWilliamsSmith)。但是,由于每个单词的第一个字母都是大写字母,因此可以区分这些单词 所以我需要将这个客户字符串列表转换为它们的常规格式,每个单词之间有空格。所以我想让约翰·威廉姆斯·史密斯成为约翰·威廉姆斯·史密斯。然而,我想不出一个立即实现这一点的方法,我相信任何Excel公式的组合都不能提供这个结果 因此,我认为唯一的解决办法是建立一个宏观经济体系。它可能是一个用作公式的Excel VBA:在字符串中的大写字母后面或前面加空格,excel,string,vba,function,uppercase,Excel,String,Vba,Function,Uppercase,我有一系列代表客户名称的文本,但它们在每个单词/名称之间没有空格(例如:JohnWilliamsSmith)。但是,由于每个单词的第一个字母都是大写字母,因此可以区分这些单词 所以我需要将这个客户字符串列表转换为它们的常规格式,每个单词之间有空格。所以我想让约翰·威廉姆斯·史密斯成为约翰·威廉姆斯·史密斯。然而,我想不出一个立即实现这一点的方法,我相信任何Excel公式的组合都不能提供这个结果 因此,我认为唯一的解决办法是建立一个宏观经济体系。它可能是一个用作公式的函数,也可能是一个用于在特定范
函数,也可能是一个用于在特定范围内处理数据的模块中的代码(假设列表位于范围(“A2:A100”)
)
有人知道我该怎么做吗?函数AddSpaces(PValue为String)为String
Function AddSpaces(PValue As String) As String
Dim xOut As String
xOut = VBA.Left(PValue, 1)
For i = 2 To VBA.Len(PValue)
xAsc = VBA.Asc(VBA.Mid(PValue, i, 1))
If xAsc >= 65 And xAsc <= 90 Then
xOut = xOut & " " & VBA.Mid(PValue, i, 1)
Else
xOut = xOut & VBA.Mid(PValue, i, 1)
End If
Next
AddSpaces = xOut
End Function
作为字符串输出
xOut=VBA.Left(PValue,1)
对于i=2到VBA.Len(PValue)
xAsc=VBA.Asc(VBA.Mid(PValue,i,1))
如果xAsc>=65且xAsc除了@Forty3对您的问题的评论之外,关于如何在VBA中使用正则表达式的答案是
话虽如此,您还是在寻找正则表达式来匹配John
,Williams
,Smith
,它是([A-Z])([A-Z]+.*)
Dim regex As New RegExp
Dim matches As MatchCollection
Dim match As match
Dim name As String
regex.Global = True
regex.Pattern = "([A-Z])([a-z]+.*?)"
name = "JohnWilliamsSmith"
Set matches = regex.Execute(name)
For Each match In matches
name = Replace(name, match.Value, match.Value + " ")
Next match
name = Trim(name)
这给了我约翰·威廉姆斯·史密斯。当然,对于像WillWilliamsWilliamson
这样的情况,还需要额外的编码。看看这里:。它工作得非常好!感谢您的快速回复!很高兴收到你的来信,塔什。继续问,拉杰什。。。你能告诉我应该在哪里调整代码以在大写字母后添加空格吗?我已经试着自己分析和弄明白,通过这个函数,我仍然觉得太高级了xOut=xOut&&&VBA.Mid(PValue,i,1)
此行添加一个空格,然后写入大写字母。如果您想在后面添加空格,我不确定您为什么要J ohnW illiamsS mith
,但是行应该是xOut=xOut&VBA.Mid(PValue,I,1)和“”
嘿,垃圾,Gabriel已经解决了这个问题。此代码将在每个字符后加空格。函数InsertSpaces(作为字符串)作为字符串InsertSpaces=Trim(替换(StrConv(S,vbUnicode),Chr(0),“”)结束函数