• ベストアンサー

配列について。

Redim した後   For i LBound(配列) To UBound(配列)    作業   Next i をしているのですが、配列の要素数を別プロセスで 計算させる場合、必ずしも要素が存在するとはかぎ りません。 その場合エラーがでるわけですが、このように配列 の中身が存在しない場合はどのように回避できるの でしょうか? VB6&Windows2000です。

質問者が選んだベストアンサー

  • ベストアンサー
  • takasebou
  • ベストアンサー率42% (61/144)
回答No.1

方法はいろいろとあると思いますが、簡単に考えますと 1.配列の要素数を別変数で管理しておき、まず最初にその変数をチェックする。 2.バリアント型にして、isArray関数を使う などが考えられると思います。

wakaranai_kun
質問者

補足

ご回答、どうもありがとうございました。 まだテストできていませんが、チャレンジしてみます。 ところで自分なりに次のように回避しようと思ったのです が・・・ 要素がない場合、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

その他の回答 (2)

  • takasebou
  • ベストアンサー率42% (61/144)
回答No.3

#1です。 下記の件ですが ErrorLabel1:   If Err.Number = 9 Then    GoTo LabelResume   End If    End Sub ここでエラーをクリアしていないので、再度同じエラーが発生しても今までと同じエラーが発生しただけですので、とびません。   If Err.Number = 9 Then    Err.Clear    GoTo LabelResume   End If にすれば大丈夫だと思います。

wakaranai_kun
質問者

お礼

何度もありがとうございます。 Err.Clearだったんですね。 知りませんでした。 今後、使っていきたいと思います。 いろいろと有効な手段が見つかり助かりました。 また、よろしくお願いします。

  • sam_inoue
  • ベストアンサー率47% (27/57)
回答No.2

' 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なら配列は無効と判断できます。

wakaranai_kun
質問者

お礼

ご回答ありがとうございます。 一つ目二つ目の違いは今はじめて知りました。 参考にさせてもらいました。 三つ目については実はその方法でやっていたの ですがしっくり来なかったので今回、質問させ てもらった次第です。 それで、再度、常に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

関連するQ&A