関数から配列を返す
Microsoft Office 2000/Visual Basic プログラマーズ ガイド | ![]() |
前の例では、配列変数を別の配列に割り当てました。この例に基づいて、次のように配列を返すプロシージャを呼び出し、その配列を別の配列に割り当てることが可能です。
Dim astr1() As String
astr1 = ReturnArray
配列を返すには、プロシージャに配列と同じデータ型、またはバリアント型 (Variant) の戻り値が必要です。プロシージャを宣言して指定のデータ型の配列を返す方法には、配列が返されたことを確認するために IsArray 関数を使用する必要がないという利点があります。プロシージャがバリアント型の値を返した場合、配列に対する操作を開始する前に内容を確認することをお勧めします。
ReturnArray プロシージャはユーザーによる入力を要求し、結果値の配列を適切な長さで作成します。このプロシージャで配列を返すためには、目的の配列をこのプロシージャ名に割り当てます。
Function ReturnArray() As String()
' この関数は、ユーザーによる入力内容を配列に挿入し、
' 配列を返します。
Dim astrItems() As String
Dim strInput As String
Dim strMsg As String
Dim lngIndex As Long
On Error GoTo ReturnArray_Err
strMsg = "値を入力するか、[キャンセル] をクリックして終了します :"
lngIndex = 0
' 配列に加える最初のアイテムをユーザーに要求します。
strInput = InputBox(strMsg)
If Len(strInput) > 0 Then
' 配列の長さを見積もります。
ReDim astrItems(0 To 2)
astrItems(lngIndex) = strInput
lngIndex = lngIndex + 1
Else
' ユーザーがアイテムを追加せずにキャンセルした場合、
' 配列のサイズを変更しません。
ReturnArray = astrItems
GoTo ReturnArray_End
End If
' ユーザーに次のアイテムを要求し、配列に追加します。
Do
strInput = InputBox(strMsg)
If Len(strInput) > 0 Then
astrItems(lngIndex) = strInput
lngIndex = lngIndex + 1
End If
' ユーザーがキャンセルするまでループします。
Loop Until Len(strInput) = 0
' 現在の lngIndex - 1 の値に合わせて調整します。
ReDim Preserve astrItems(0 To lngIndex - 1)
ReturnArray = astrItems
ReturnArray_End:
Exit Function
ReturnArray_Err:
' 上限を超えている場合は、配列を拡大します。
If Err = ERR_SUBSCRIPT Then ' サブスクリプトが範囲外です。
' 配列の長さを 2 倍にします。
ReDim Preserve astrItems(lngIndex * 2)
Resume
Else
MsgBox "予期せぬエラーが発生しました!", vbExclamation
Resume ReturnArray_End
End If
End Function
ReturnArray プロシージャをテストするには GetArray プロシージャを実行します。GetArray プロシージャは、Office 2000 Developer CD-ROM の ODETools\V9\Samples\OPG\Samples\CH07 サブフォルダに含まれる VBA.mdb の modArrays モジュールにあります。
配列を返すプロシージャを呼び出す際は、返される配列に要素が含まれていない場合を考慮に入れる必要があります。たとえば、前の ReturnArray プロシージャで、最初に表示される入力ボックスをキャンセルすると、要素が含まれていない配列が返されます。呼び出し元のプロシージャはこの状態に対する確認を行う必要があります。この確認を行う最適の方法は、配列を受け取って上限を確認する次のようなプロシージャを定義することです。配列に要素がない場合、上限の確認を行うとトラップ可能なエラーが発生します。
Function IsArrayEmpty(varArray As Variant) As Boolean
' 配列に要素が含まれるかどうかを調べます。
' 要素が含まれる場合は False、含まれない場合は
' True を返します。
Dim lngUBound As Long
On Error Resume Next
' 配列が空の場合、配列の上限または下限を確認する際に
' エラーが発生します。
lngUBound = UBound(varArray)
If Err.Number <> 0 Then
IsArrayEmpty = True
Else
IsArrayEmpty = False
End If
End Function
IsArrayEmpty プロシージャは、Office 2000 Developer CD-ROM の ODETools\V9\Samples\OPG\Samples\CH07 サブフォルダに含まれる VBA.mdb の modArrays モジュールにあります。
メモ VBA の Split および Filter 関数も要素を含まない配列を返します。ただし、これらのプロシージャのいずれかによって返される配列で上限または下限を確認してもエラーは発生しません。要素を含まない配列を Split または Filter 関数が返す場合、その配列の下限は 0、上限は –1 になります。つまり、配列の上限が下限より小さいかどうかを調べることにより、返される配列に要素が含まれているかどうかを確認できます。例については、この章の「文字列を変換する」の ConvertToProperCase プロシージャを参照してください。