Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA:在字符串中的大写字母后面或前面加空格_Excel_String_Vba_Function_Uppercase - Fatal编程技术网

Excel VBA:在字符串中的大写字母后面或前面加空格

Excel VBA:在字符串中的大写字母后面或前面加空格,excel,string,vba,function,uppercase,Excel,String,Vba,Function,Uppercase,我有一系列代表客户名称的文本,但它们在每个单词/名称之间没有空格(例如:JohnWilliamsSmith)。但是,由于每个单词的第一个字母都是大写字母,因此可以区分这些单词 所以我需要将这个客户字符串列表转换为它们的常规格式,每个单词之间有空格。所以我想让约翰·威廉姆斯·史密斯成为约翰·威廉姆斯·史密斯。然而,我想不出一个立即实现这一点的方法,我相信任何Excel公式的组合都不能提供这个结果 因此,我认为唯一的解决办法是建立一个宏观经济体系。它可能是一个用作公式的函数,也可能是一个用于在特定范

我有一系列代表客户名称的文本,但它们在每个单词/名称之间没有空格(例如: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),“”)结束函数