セル内のすべての単語を大文字で分割したいと思います。例:
元の値:
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
これがワークシート関数ソリューションです。それはきれいではありませんが、VBAの使用を完全に嫌うなら、醜いオプションだけで立ち往生していると思います。 A1
のテキストの場合は、以下をB1
に貼り付けて、を押します。 Ctrl+Shift+Enter 数式を配列数式として入力するには:
=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
に名前のリストがあり、任意の名前のほとんどの単語が4つであると思われる場合は、B1
に数式を入力できます(配列数式として!)。 B10
まで下がってから、E10
まで右に入力します。分割名のリストはE1:E10
にあります。
うさぎの穴を飛び降りる傾向がある場合は、式の機能について簡単に説明します。
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。
これは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
これは、ユーザー定義関数として機能します。
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