変数の配列が設定されたか取得するには?

解決


セロファン  2003-12-16 01:36:59  No: 110733

Dim A() As Integer

としたとき、UBound(A)とするとエラーが起きてしまいます。
これを未然に防ぐために、添字の数字が設定されたか取得したいのですが、
そのような事はできるのでしょうか?


いな  2003-12-16 01:39:45  No: 110734

私の場合、こんな関数を自前で用意しています。
添え字が設定されていない場合には-1を返します。
--
Public Function cmnUBound(strAr() As String) As Long
    On Error GoTo cmnUBound_ERR
    
    cmnUBound = UBound(strAr)
    Exit Function

cmnUBound_ERR:
    If Err.Number = 9 Then
        cmnUBound = -1
    End If
    
End Function


セロファン  2003-12-16 02:25:18  No: 110735

こんなにご返事早くいただきありがとうございます。

やはりエラーを起こして取得するしかないんですね。参考になりました。


セロファン  2003-12-17 05:13:05  No: 110736

解決したのに弁乗して申し訳ありませんが、
逆に、数字が設定された変数を再び未設定にすることはできるのでしょうか


魔界の仮面弁士  2003-12-17 07:10:59  No: 110737

SafeArrayCreateVector か SafeArrayAllocDescriptor を使って、
空の配列(要素数0の1次元配列)を作っておくと、UBoundしても
エラーにならないので、後が楽かも知れません。

ちなみに幾つかのデータ型は、APIを使わずとも、
http://madia.world.coocan.jp/cgi-bin/VBBBS/wwwlng.cgi?print+200308/03080063.txt
のようにして、空の配列を生成できます。

> これを未然に防ぐために、添字の数字が設定されたか取得したいのですが、

Private Declare Sub RtlMoveMemory Lib "kernel32" _
   (ByRef Dst As Long, _
    ByRef Src() As Any, _
    Optional ByVal Length As Long = 4&)

という宣言をしておいて、
    Dim A() As Integer
    Dim P As Long

    CopyMemoryFromArray P, A
    If P = 0 Then
        MsgBox "Aは空の配列です。"
    Else
        MsgBox "Aは既にReDimされています。"
    End If
のようにして判定してみるとか。

> 逆に、数字が設定された変数を再び未設定にすることはできるのでしょうか
Eraseステートメントを使ってみてください。


魔界の仮面弁士  2003-12-17 07:36:19  No: 110738

上記コードの訂正です。m(_ _;)m

誤:
>    CopyMemoryFromArray P, A

正:
     RtlMoveMemory P, A


セロファン  2003-12-17 23:48:07  No: 110739

同じ質問が過去にあったんですね。

しかし、UBoundで止めておかないと後処理ができないコードなので
APIを使わせていただきました。
エラートラップでは変数型で分けて作らなければなりませんでしたが
こっちはお構いなしなので便利ですね。
ありがとうございました。


魔界の仮面弁士  2003-12-18 01:22:01  No: 110740

> エラートラップでは変数型で分けて作らなければなりませんでしたが

以下のようにすれば、型別に分けずとも済むのでは。

'=======================
Option Explicit

Private Sub Form_Load()
    Dim S() As String, L() As Long
    Debug.Print UBoundEx(S), UBoundEx(L)

    ReDim S(10), L(5)
    Debug.Print UBoundEx(S), UBoundEx(L)

    Erase S, L
    Debug.Print UBoundEx(S), UBoundEx(L)
End Sub

Public Function UBoundEx(ByVal Ary As Variant) As Long
    UBoundEx = -1
    On Error Resume Next
    UBoundEx = UBound(Ary)
    On Error GoTo 0
End Function


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加