19

セル内のすべての単語を大文字で分割したいと思います。例:

元の値:

MikeJones
RinaJonesJunior
MichealSamuelsLurth

期待される出力:

Mike Jones
Rina Jones Junior
Micheal Samuels Lurth

VBAを使わなくてもできますか?

4

6 に答える 6

27

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
于 2012-04-18T02:39:52.847 に答える
18

ワークシート関数のソリューションを次に示します。きれいではありませんが、VBA の使用を完全に嫌う場合は、醜いオプションだけで立ち往生していると思います。のテキストについてはA1、次を に貼り付けて+ +をB1押し、数式を配列数式として入力します。CtrlShiftEnter

=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ます。

式の使用例

うさぎの穴に飛び込みたい場合は、式の機能を簡単に説明します。

  1. 各文字をチェックして、大文字の ASCII 範囲内にあり、スペースが前に付いていないかどうかを確認します。名前の最初の文字はスキップされます。
  2. 文字列の長さ (マイナス 1) に等しいサイズの配列は、次のように設定されます。一致するものが見つからない場合は、元の文字列が保存されます。
  3. 一致に対応するこの配列の最初の要素が返されます。一致するものが見つからない場合は、元の文字列が返されます。
于 2012-04-17T14:37:01.880 に答える
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。

于 2012-04-17T13:29:32.127 に答える
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
于 2012-04-17T13:03:38.680 に答える
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
于 2012-04-17T17:55:08.400 に答える
-2
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
于 2016-09-19T15:06:59.847 に答える