シート上でSplit関数っぽく振舞うユーザー定義関数を作ってみた の続き

昨日は、シート上でSplit関数っぽく振舞うユーザー定義関数を作ってみた。
infoment.hatenablog.com

すると、ExcelVBAerさんから次のようなコメントを寄せていただいた。
(いつもありがとうございます)。

ユーザ定義関数として使ってるので、
現状では不具合は無いと思いますが、
index を関数の中で調整してるので、
Byval にしておいた方が無難ですかね~

確かに、仰る通りだ。
そこで、これを含めた修正を行うと共に、使い処について少し考えてみた。
f:id:Infoment:20190605191430p:plain

まずご指摘の件について、確かにコード内で値を-1している。

index = index - 1

シート上で使うのなら問題ないが、念のためByVal(値渡し)にしておこう。
※ByRef(参照渡し)とした場合、呼び出し元まで変わってしまうリスクがある。
www.k1simplify.com

ついでに、indexで0を指定した場合、つまり「0個目は何?」に対しては、「何個に区切れるか?」を戻り値にするとしよう。

Function SubSplit(expression As String, _
         Optional delimiter As String = ",", _
         Optional ByVal index As Long = 0) As String

    Dim arr As Variant
        arr = Split(expression, delimiter)

        ' 配列が0始まりのため。
        index = index - 1

        If UBound(arr) < index Then
            SubSplit = "要素の上限を上回っています。"
        ElseIf index = -1 Then
            SubSplit = UBound(arr) + 1
        ElseIf index < -1 Then
            SubSplit = "要素の下限を下回っています。"
        Else
            SubSplit = arr(index)
        End If
End Function

すると、こんな感じになる。
f:id:Infoment:20190605193554p:plain


「あ,い,う,え,お」という文字を「,」で区切ると、5つの塊になることがわかる。
参考までに補足すると、区切られる文字の数は不問で、例えばこんな感じだ。
f:id:Infoment:20190605193937p:plain


区切り文字の初期値は「,」で、同じく「0」を初期値としているため、このような記述も可能だ(「,」も「0」も省略可能)。
f:id:Infoment:20190605194135p:plain


では、↓このような文字列から「金太郎」を抽出したい場合、どうすればよいだろう。
f:id:Infoment:20190605194516p:plain


この場合は、単純に2回使えばOKだ。
f:id:Infoment:20190605195020p:plain


ただしネストして括弧が大量に並ぶと、式を書いた本人すら解読不能になるため、
注意が必要だ。

後は、使う人の工夫次第ってことで。

参考まで。