我想用大寫,一個例子,我的細胞分裂的所有單詞:在Excel
原始值:
MikeJones
RinaJonesJunior
MichealSamuelsLurth
預期輸出:
Mike Jones
Rina Jones Junior
Micheal Samuels Lurth
可以這樣做不使用VBA?
我想用大寫,一個例子,我的細胞分裂的所有單詞:在Excel
原始值:
MikeJones
RinaJonesJunior
MichealSamuelsLurth
預期輸出:
Mike Jones
Rina Jones Junior
Micheal Samuels Lurth
可以這樣做不使用VBA?
承認了Excellll卓越的公式,最有效的代碼解決方案將基於RegExp
。這避免了長循環。
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
我一直希望你能與RegEx解決方案一起來!這似乎是要走的路。 – 2012-04-18 03:22:08
效率更高! – playercharlie 2012-04-18 06:57:24
+ 1 :-D我同意道格。 – 2012-04-18 09:33:35
你必須用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
既然你說你不想使用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。
UDF肯定是要走的路,但下面的@brettdj的正則表達式示例更有效。至少這一個應該從字符2開始 – 2012-08-21 21:53:39
這是工作表功能解決方案。這並不漂亮,但如果你完全反對使用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
。
如果你傾向於跳下兔子洞,這裏的公式做什麼的簡要說明:
@DougGlancy哈哈感謝 – Excellll 2012-04-17 14:59:12
+ 1爲偉大的本地Excel功能的使用。不知道你是怎麼做到的! – 2012-04-17 17:56:01
@Remnant,前幾天我做了一篇文章,講述了相當多的這些函數,用於類似的問題。如果您對此感興趣,請訪問:http://yoursumbuddy.com/solving-the-npr-sunday-puzzle-3/。當我看到Excell讓我摔倒了一英里時,我正試圖將這個答案放在一起:)。 – 2012-04-18 01:41:51
這將作爲用戶定義的功能。
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
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
我不認爲這是可能的,而無需使用VBA。 – assylias 2012-04-17 11:43:03
這是可能的;這只是不太實際(見下文)。 – Excellll 2012-04-17 14:41:39