2017-04-05 49 views
1

我有一系列代表客戶名稱的文本,但它們在每個單詞/名稱之間沒有空格(例如:JohnWilliamsSmith)。但是,由於每個單詞的首字母都是大寫,因此這些單詞可以區分。VBA:在字符串中的一個upppercase字母之後或之前放置一個空格

所以我需要將這個客戶字符串列表轉換爲它們的常規格式,每個單詞之間有空格。所以我想約翰威廉姆斯史密斯成爲約翰威廉姆斯史密斯。但是,我無法想到實現這一目標的直接方法,並且我相信沒有任何Excel公式組合可以提供此結果。

因此,我認爲唯一的解決方案是設置一個宏。它可能是一個Function用作公式,或模塊中的代碼來處理特定範圍內的數據(想象列表在Range ("A2: A100")中)。

有沒有人有任何想法我可以做到這一點?

+3

看看這裏:[Excel Regex](http://stackoverflow.com/questions/22542834/how-to-use-regular-expressions-regex-in-microsoft-excel-both-in-cell-and -loops)。 – Forty3

回答

2
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 

注意:使用此函數公式是= Addspace(A1)。

+0

它工作完美!謝謝你的快速反應! –

+0

很高興看到你聽到塔什。繼續問。 –

+0

Rajesh ...你能告訴我在哪裏應該調整代碼來添加大寫字母后的空格呢?我試圖分析和找出自己,通過這個功能對我來說仍然是很先進的! –

1

除了@ Forty3對您的問題的評論,關於如何在VBA中使用正則表達式的答案是here

有了這樣說,那麼你正在尋找的正則表達式匹配JohnWilliamsSmith這是([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) 

這給了我John Williams Smith。當然,需要額外的編碼來解決像WillWilliamsWilliamson這樣的情況。

相關問題