2012-04-17 50 views
15
拆分大寫單詞

我想用大寫,一個例子,我的細胞分裂的所有單詞:在Excel

原始值:

MikeJones 
RinaJonesJunior 
MichealSamuelsLurth 

預期輸出:

Mike Jones 
Rina Jones Junior 
Micheal Samuels Lurth 

可以這樣做不使用VBA?

+1

我不認爲這是可能的,而無需使用VBA。 – assylias 2012-04-17 11:43:03

+2

這是可能的;這只是不太實際(見下文)。 – Excellll 2012-04-17 14:41:39

回答

18

承認了Excellll卓越的公式,最有效的代碼解決方案將基於RegExp。這避免了長循環。

enter image description here

Function SplitCaps(strIn As String) As String 
Dim objRegex As Object 
Set objRegex = CreateObject("vbscript.regexp") 
With objRegex 
    .Global = True 
    .Pattern = "([a-z])([A-Z])" 
    SplitCaps = .Replace(strIn, "$1 $2") 
End With 
End Function 
+2

我一直希望你能與RegEx解決方案一起來!這似乎是要走的路。 – 2012-04-18 03:22:08

+1

效率更高! – playercharlie 2012-04-18 06:57:24

+1

+ 1 :-D我同意道格。 – 2012-04-18 09:33:35

1

你必須用VBA來做到這一點。

Sub insertspaces() 
Range("A1").Select 
Do 
    Row = ActiveCell.Row 
    Column = ActiveCell.Column 
    vlaue = ActiveCell.Value 
    If vlaue = "" Then Exit Do 
     Length = Len(vlaue) 
     If Length > 1 Then 
      For x = Length To 2 Step -1 
      par = Mid(vlaue, x, 1) 
      cod = Asc(par) 
      If (cod > 64 And cod < 91) Or (cod > 191 And cod < 222) Then 
      vlaue = Left(vlaue, x - 1) + " " + Mid(vlaue, x) 
      End If 
     Next 
     ActiveCell.Value = vlaue 
     End If 
    Row = Row + 1 
    Cells(Row, Column).Select 
Loop 
End Sub 
3

既然你說你不想使用VBA宏,但問題需要VBA,我認爲UDF對你來說是個不錯的解決方案。這是一個可以使用的UDF(用戶定義函數)。將此代碼放入與數據相同的文件的通用模塊中。

Function splitbycaps(inputstr As String) As String 

Dim i As Long 
Dim temp As String 

If inputstr = vbNullString Then 
    splitbycaps = temp 
    Exit Function 
Else 
    temp = inputstr 
    For i = 1 To Len(temp) 
     If Mid(temp, i, 1) = UCase(Mid(temp, i, 1)) Then 
      If i <> 1 Then 
       temp = Left(temp, i - 1) + " " + Right(temp, Len(temp) - i + 1) 
       i = i + 1 
      End If 
     End If 
    Next i 
    splitbycaps = temp 

End If 
End Function 

您現在可以直接在單元格中使用該函數。假設你有A1中的數據 - >「MikeJones」 而你想在單元格A2中回答。所以在A2中,你輸入

=splitbycaps(A1) 

你會得到你的輸出。 HTH。

+1

UDF肯定是要走的路,但下面的@brettdj的正則表達式示例更有效。至少這一個應該從字符2開始 – 2012-08-21 21:53:39

17

這是工作表功能解決方案。這並不漂亮,但如果你完全反對使用VBA,那麼我認爲你只會遇到難看的選擇。對於A1文本,粘貼以下爲B1,然後按Ctrl鍵++輸入輸入公式作爲數組公式:

=IFERROR(INDEX(IF(CODE(MID(D1,ROW(INDIRECT("A2:A"&LEN(D1))),1))<=90,IF(CODE(MID(D1,ROW(INDIRECT("A2:A"&LEN(D1))),1))>=65,IF(MID(D1,ROW(INDIRECT("A1:A"&LEN(D1)-1)),1)<>" ",REPLACE(D1,ROW(INDIRECT("A2:A"&LEN(D1))),1," "&MID(D1,ROW(INDIRECT("A2:A"&LEN(D1))),1)),D1),D1),D1),MIN(IF(CODE(MID(D1,ROW(INDIRECT("A2:A"&LEN(D1))),1))<=90,IF(CODE(MID(D1,ROW(INDIRECT("A2:A"&LEN(D1))),1))>=65,IF(MID(D1,ROW(INDIRECT("A1:A"&LEN(D1)-1)),1)<>" ",ROW(INDIRECT("A1:A"&LEN(D1)-1)),2000000),2000000),2000000))),D1) 

我告訴你這是醜陋的!

對於所有這些努力,這隻會分裂第一名和第二名。如需更多拆分,請將公式填入右側。例如,如果您在A1:A10中有一個名稱列表,並且您認爲任何名稱中的大多數單詞都是四個,那麼可以在B1(作爲數組公式)中輸入公式,填寫爲B10,然後填寫E10。您的分割名稱列表將在E1:E10

sample use of formula

如果你傾向於跳下兔子洞,這裏的公式做什麼的簡要說明:

  1. 檢查每個字符,看它是否是在ASCII範圍大寫字母並且不在前面有空格。該名稱的第一個字符被跳過。
  2. 一個大小等於字符串長度(減1)的數組填充如下:如果找到一個匹配項,則字符串將被存儲,而匹配字符會被一個空格替換爲其前面的空格。如果找不到匹配,則存儲原始字符串。
  3. 返回該數組中與匹配對應的第一個元素。如果找不到匹配,則返回原始字符串。
+1

@DougGlancy哈哈感謝 – Excellll 2012-04-17 14:59:12

+0

+ 1爲偉大的本地Excel功能的使用。不知道你是怎麼做到的! – 2012-04-17 17:56:01

+0

@Remnant,前幾天我做了一篇文章,講述了相當多的這些函數,用於類似的問題。如果您對此感興趣,請訪問:http://yoursumbuddy.com/solving-the-npr-sunday-puzzle-3/。當我看到Excell讓我摔倒了一英里時,我正試圖將這個答案放在一起:)。 – 2012-04-18 01:41:51

0

這將作爲用戶定義的功能。

Function SplitOnCapital(str As String) As String 
    Dim letter As Byte, result As String 

    For letter = 2 To Len(str) 
     If Asc(VBA.Mid$(str, letter, 1)) < 90 Then //65 to 90 are char codes for A to Z 
      result = WorksheetFunction.Replace(str, letter, 0, " ") 
      letter = letter + 1 
     End If 
    Next letter 

    SplitOnCapital = result 
End Function 
-1
Sub caps_small() 

strIn = InputBox("Enter a string:") 

For i = 1 To Len(strIn) 

    If Mid(strIn, i, 1) Like "[A-Z]" Then 
     cap = Mid(strIn, i, 1) 
     capstr = capstr & cap 

    ElseIf Mid(strIn, i, 1) Like "[a-z]" Then 
     sml = Mid(strIn, i, 1) 
     smlstr = smlstr & sml 
    End If 
Next 

MsgBox capstr 

MsgBox smlstr 


End Sub