Dim A() As Integer
としたとき、UBound(A)とするとエラーが起きてしまいます。
これを未然に防ぐために、添字の数字が設定されたか取得したいのですが、
そのような事はできるのでしょうか?
私の場合、こんな関数を自前で用意しています。
添え字が設定されていない場合には-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
こんなにご返事早くいただきありがとうございます。
やはりエラーを起こして取得するしかないんですね。参考になりました。
解決したのに弁乗して申し訳ありませんが、
逆に、数字が設定された変数を再び未設定にすることはできるのでしょうか
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ステートメントを使ってみてください。
上記コードの訂正です。m(_ _;)m
誤:
> CopyMemoryFromArray P, A
正:
RtlMoveMemory P, A
同じ質問が過去にあったんですね。
しかし、UBoundで止めておかないと後処理ができないコードなので
APIを使わせていただきました。
エラートラップでは変数型で分けて作らなければなりませんでしたが
こっちはお構いなしなので便利ですね。
ありがとうございました。
> エラートラップでは変数型で分けて作らなければなりませんでしたが
以下のようにすれば、型別に分けずとも済むのでは。
'=======================
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
ツイート | ![]() |