小池啓仁 ヒロヒト応援ブログ By はてな

小池啓仁(コイケヒロヒト)の動画など。

小池啓仁 ヒロヒト応援ブログ By はてな

UBoundで要素がない配列を渡すには?

UBoundは、配列の最大インデックスを返す関数です。
なので、For文のリミット値によく使用します。


しかし、要素がない・・・つまり空の配列を渡すとエラー割り込みが発生するのです。
この場合のエラー割り込みは、エラーとしたくない時もありますね。


そんな時のために、local_UBound関数を作ってみました。

Private Sub CommandButton1_Click()
Dim strA() As String
Dim int_i As Integer

'    For int_i = 0 To 10 Step 1
'        ReDim Preserve strA(int_i)
'        strA(int_i) = "AAA" & int_i
'    Next
     
'    For int_i = 0 To UBound(strA) Step 1
'        Debug.Print int_i
'    Next
    
    For int_i = 0 To local_UBound(strA) Step 1
        Debug.Print int_i
    Next
End Sub

Function local_UBound(ByRef pArray)
On Error Resume Next
    local_UBound = UBound(pArray)
    Select Case Err.Number
      Case 0
      Case 9
           local_UBound = -1
      Case Else
           MsgBox Err.Description & "(" & Err.Number & ")", vbOKOnly + vbCritical, Err.Source
           End
    End Select
End Function

◆ 補足

local_UBound関数の引数を『ByRef pArray』にしているのは、まず、配列なので参照渡し(ByRef)にしています。
そして、Asでデータ型指定をしないのは、いろいろな型に対応するためです。
UBoundした時に、要素があれば、Err.Numberは、0となり、なければ、9となります。


また、要素が無い時は、local_UBound関数は、-1を返します。
なので、For文のStep値 はプラス値でないとなりません。


あと、『On Error Resume Next』は、UBoundで割り込みエラーが起こっても、制御をシステムに渡さず、つぎの命令文(今回は Select Case)を実行します。つまり、 割り込みを無視することができるのです。