web-dev-qa-db-ja.com

VBAで文字列をスペースで分割

セルを呼び出して渡すことができるExcelの関数が必要です。入力:

_Firstname          Lastname      [email protected]       
Firstname      midname     Lastname      [email protected]
_

その間のスペースの数はランダムです。出力は配列でなければなりません。文字列がどのように見えるかわからないので、配列は任意の長さにすることができます。出力は次のようになります。

_Firstname, Lastname, [email protected]       
Firstname, midname, Lastname, [email protected]
_

=MySplitFunction(A1)のような1つのセルから関数を呼び出すと、FirstnameがA1、LastnameがB1、email @ mail.comがC1に配置されます。新しいモジュールを作成し、次のコードを試しました。

_Function MySplitFunction(s As String) As String()
    MySplitFunction = Split(s, " ")
End Function
_

これは私に出力を与えます

_Firstname
_

配列全体を返すにはどうすればよいですか? 1つのセルに関数を記述して、それに近いセルにデータを配置することもできますか?

編集:

enter image description here

9
Goatcat
  • A1にデータを入力してください
  • B1:D1範囲を選択します
  • 数式を入力してください=MySplitFunction(A1)
  • enterキーだけでなく、Ctrl + Shift + Enterキーを押して、配列数式にします。

複数のスペースを削除するには、次のようにコードを修正します(非常に効率的ではありませんが機能します)。

Function MySplitFunction(s As String) As String()
    Dim temp As String

    Do
      temp = s
      s = Replace(s, "  ", " ") 'remove multiple white spaces
    Loop Until temp = s

    MySplitFunction = Split(Trim(s), " ") 'trim to remove starting/trailing space
End Function
12
assylias

代替ソリューションは次のとおりです。

  1. すべてのスペースを削除する最初のステップとしてRegExを使用します
  2. 左の単一のスペースに基づいて最初にステップの結果を分割する
  3. さらに、別のセルのテキストの別の要素を返す必要があるため、追加の関数パラメーターはそれを解決します。

これは提案された機能です:

Public Function MySplitFunction(sMark As String, nTh As Integer) As String

On Error GoTo EH
    'regexp declaration
    Dim objRegExp As Object
    Set objRegExp = CreateObject("vbscript.regexp")

    Dim tmpTXT As String
    Dim tmpArr As Variant
    With objRegExp
        .Global = True
        .Pattern = "\s+"

        tmpTXT = .Replace(sMark, " ")
    End With

    tmpArr = Split(tmpTXT, " ")
    MySplitFunction = tmpArr(nTh - 1)

Exit Function
EH:
    MySplitFunction = ""

End Function

これは、それがどのように機能するかを示すスクリーンショットです:

enter image description here

重要! Excelで関数を呼び出すときは、パラメーターを区切るためにコンマを使用します(使用しているローカルバージョンのExcelのため、セミコロンは表示されません)。

5
Kazimierz Jawor