次の方法で共有


関数から配列を返す

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 プロシージャを参照してください。