- ベストアンサー
配列について。
Redim した後 For i LBound(配列) To UBound(配列) 作業 Next i をしているのですが、配列の要素数を別プロセスで 計算させる場合、必ずしも要素が存在するとはかぎ りません。 その場合エラーがでるわけですが、このように配列 の中身が存在しない場合はどのように回避できるの でしょうか? VB6&Windows2000です。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
方法はいろいろとあると思いますが、簡単に考えますと 1.配列の要素数を別変数で管理しておき、まず最初にその変数をチェックする。 2.バリアント型にして、isArray関数を使う などが考えられると思います。
その他の回答 (2)
- takasebou
- ベストアンサー率42% (61/144)
#1です。 下記の件ですが ErrorLabel1: If Err.Number = 9 Then GoTo LabelResume End If End Sub ここでエラーをクリアしていないので、再度同じエラーが発生しても今までと同じエラーが発生しただけですので、とびません。 If Err.Number = 9 Then Err.Clear GoTo LabelResume End If にすれば大丈夫だと思います。
お礼
何度もありがとうございます。 Err.Clearだったんですね。 知りませんでした。 今後、使っていきたいと思います。 いろいろと有効な手段が見つかり助かりました。 また、よろしくお願いします。
- sam_inoue
- ベストアンサー率47% (27/57)
' IsArrayチェックでは意味なし Sub TEST1() Dim A() MsgBox IsArray(A) ReDim A(1) MsgBox IsArray(A) End Sub ' IsArrayが有効な例 Sub TEST2() Dim A MsgBox IsArray(A) ReDim A(1) MsgBox IsArray(A) End Sub ' 配列要素数=0を使わない例 Sub TEST3() Dim A() ReDim A(0) MsgBox UBound(A) ReDim A(5) MsgBox UBound(A) End Sub 最初にReDim A(0)としてしまい、 有効要素はIndex=1以降を使うことします。 このままUBound(A)=0なら配列は無効と判断できます。
お礼
ご回答ありがとうございます。 一つ目二つ目の違いは今はじめて知りました。 参考にさせてもらいました。 三つ目については実はその方法でやっていたの ですがしっくり来なかったので今回、質問させ てもらった次第です。 それで、再度、常に0番から有効値を埋めるに は?と考え次の方法で何とかなることがわかり ました。 配列数は返ってきたRecordeCountで決めています。 Function Test() As String() Dim RS Dim i Dim Hairetsu() If RS.RecordCount > 0 Then For i = 0 To RS.RecordCount ReDim Preserve Hairetsu(i) Hairetsu(i)="Test" & i Next i Else ReDim Hairetsu(0) Hairetsu(0) = "No Element" End If Test=Hairetsu End Function
補足
ご回答、どうもありがとうございました。 まだテストできていませんが、チャレンジしてみます。 ところで自分なりに次のように回避しようと思ったのです が・・・ 要素がない場合、Err.Number = 9 が返って来るようで 次のように回避しようとしました。 この場合、i=0の時はErrorLabel1:へ飛べるのですが、 i=1になった場合、ErrorLabel1:へ飛べずにそこで止 まってしまいます。 これは仕様なのでしょうか? Sub ABC() Dim i As Integer, j As Integer Dim oNodList AS Node For i = 0 to Max -1 oNodList = Get_ChildList() 'ここで配列の取得 On Error Goto ErrorLabel For j = LBound(oNodList) To UBound(oNodList) '作業 Next j LabelResume: Next i Exit Sub ErrorLabel1: If Err.Number = 9 Then GoTo LabelResume End If End Sub