即効テクニック

関数関連のテクニック

Excel2000Split関数の代替

(Excel 97)
以下のサンプルではExcel2000から提供されているSplit関数の機能と同じように、ある区切り文字によって区切られた文字列の1次元配列化を行います。
Function SplitFor97 _
    (TargetString As Variant, Delimiter As String) As Variant
'================================
'機能:エクセル2000のSplit関数代替
'※Tab区切りには対応していません
'
'TargetString
'  配列化する対象文字列。Delimiterによって各要素に分割可能であること
'
'Delimiter 区切り文字
'================================
Dim varRet() As Variant
Dim i As Long
Dim LoopFlag As Boolean
Dim PreviousPos As Long, NextPos As Long

'区切り文字の位置確定用の変数に初期値を設定
PreviousPos = 1: NextPos = 0
'ループ脱出用フラグ初期値をFalseとする
LoopFlag = False

Do
NextPos = InStr(PreviousPos, TargetString, Delimiter, vbTextCompare)
'対象文字列の最後の要素は次の区切り文字がないためループ脱出用フラグをTrueにする
If NextPos = 0 Then: LoopFlag = True: NextPos = Len(TargetString) + 1

    ReDim Preserve varRet(0 To i)
    varRet(i) = CStr(Mid(TargetString, PreviousPos, NextPos - PreviousPos))
    PreviousPos = NextPos + 1
    i = i + 1
    Debug.Print NextPos & ":" & PreviousPos
Loop Until LoopFlag = True

SplitFor97 = varRet

End Function

Sub TestProcForMySplit() 'テスト用

Dim TargetString As Variant ' 配列化する対象文字列
Dim Ret As Variant  '配列格納用
Dim msg As String   'メッセージボックス表示用
Dim i As Integer

TargetString = "Excel-Access-PowerPoint-Outlook-Word"

'区切り文字指定で配列化
Ret = SplitFor97(TargetString, "-")

'配列の下限から上限までループし、各要素を文字列変数に格納
For i = LBound(Ret) To UBound(Ret)
msg = msg & vbCrLf & Ret(i)
Next i

'配列の各要素と配列化が行われたことを確認
MsgBox msg & vbCrLf & vbCrLf & "IsArray = " & IsArray(Ret)

End Sub