シート上でSplit関数っぽく振舞うユーザー定義関数を作ってみた の続き
昨日は、シート上でSplit関数っぽく振舞うユーザー定義関数を作ってみた。
infoment.hatenablog.com
すると、ExcelVBAerさんから次のようなコメントを寄せていただいた。
(いつもありがとうございます)。
ユーザ定義関数として使ってるので、
現状では不具合は無いと思いますが、
index を関数の中で調整してるので、
Byval にしておいた方が無難ですかね~
確かに、仰る通りだ。
そこで、これを含めた修正を行うと共に、使い処について少し考えてみた。
まずご指摘の件について、確かにコード内で値を-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
すると、こんな感じになる。
「あ,い,う,え,お」という文字を「,」で区切ると、5つの塊になることがわかる。
参考までに補足すると、区切られる文字の数は不問で、例えばこんな感じだ。
区切り文字の初期値は「,」で、同じく「0」を初期値としているため、このような記述も可能だ(「,」も「0」も省略可能)。
では、↓このような文字列から「金太郎」を抽出したい場合、どうすればよいだろう。
この場合は、単純に2回使えばOKだ。
ただしネストして括弧が大量に並ぶと、式を書いた本人すら解読不能になるため、
注意が必要だ。
後は、使う人の工夫次第ってことで。
参考まで。