モジュール変数としての二次元配列の宣言


にゃー  2004-01-10 08:04:55  No: 111193  IP: [192.*.*.*]

モジュール変数としての二次元配列の宣言の仕方が分かりません。

宣言したいテーブルは以下です。
Dim table(1) As Variant
table(0) = Array("0","1","2")
table(1) = Array("3","4","5")

ローカル変数として宣言すれば通るのですが、モジュールにしたとたんに通らなくなってしまいます。
なぜなのでしょうか?

環境はVB6.0です。

編集    削除
魔界の仮面弁士  2004-01-10 09:25:19  No: 111194  IP: [192.*.*.*]

> モジュール変数としての二次元配列の宣言の仕方が分かりません。
「Private table(1, 2) As Variant」とか…。

> 宣言したいテーブルは以下です。
> Dim table(1) As Variant
> table(0) = Array("0","1","2")
> table(1) = Array("3","4","5")
これは二次元配列ではなく、一次元のジャグ配列ですね。

編集    削除
しゅう  2004-01-10 10:15:44  No: 111195  IP: [192.*.*.*]

配列を初期化する位置が悪いのでは?
勘違いであったらごめんなさい。

Dim table(1) As Variant
'配列の初期化をここで行っているのでは?
Private Sub Form1_Load()
'配列の初期化をここで行うと問題ありません。
    table(0) = Array("0", "1", "2")
    table(1) = Array("3", "4", "5")
End Sub
Private Sub Command1_Click()
    MsgBox table(1)(2)
End Sub

編集    削除
にゃー  2004-01-10 11:17:47  No: 111196  IP: [192.*.*.*]

しゅうさんのやり方でできました。

しかし配列の数が386*8のサイズなので、
Private Sub Form1_Load()
      :
End Sub
の間で初期化しようとするとプロシージャが大きすぎますというエラーがでてしまいます。

配列の初期化を
syokika1
syokika2
という二つのサブルーチンプロシージャに分ければコンパイルはできましたが、
なんとか一つで済ませる方法はありませんでしょうか?

編集    削除
魔界の仮面弁士  2004-01-10 19:07:25  No: 111197  IP: [192.*.*.*]

データをバイナリファイルとして外部に持っておき、それをGet#ステートメントで一括取得するとか。

編集    削除
にゃー  2004-01-11 08:56:50  No: 111198  IP: [192.*.*.*]

頂いたアドバイスを参考にして

Dim Table(1 To 3) As Variant
Dim IndexNo As Integer
Private Sub Form_Load()
    Func
End Sub
Private Sub ComboBox_Click(Index As Integer)
    IndexNo = ComboBox(Index).Index
    Label1.Caption = Table(IndexNo)(0)
    Label2.Caption = Table(IndexNo)(1)
    Label3.Caption = Table(IndexNo)(2)
End Sub
Sub Func()
    Table(1) = Array(40, 45, 35)
    Table(2) = Array(50, 65, 45)
    Table(3) = Array(70, 85, 65)
End Sub

というものを作ったんですが、型が一致しませんというエラーがでて、解消せきません。
ComboBoxはコントロール配列で、SSTabのそれぞれのページ毎に設置してあります。

編集    削除
Say  2004-01-11 19:46:31  No: 111199  IP: [192.*.*.*]

>   IndexNo = ComboBox(Index).Index

これって、無意味では?

IndexNo = Combo1(Index).Text
の間違いかなにかで、
ComboBoxには数値にキャスト不能な文字列が入っているとか・・・

編集    削除
にゃー  2004-01-11 23:54:51  No: 111200  IP: [192.*.*.*]

>  IndexNo = ComboBox(Index).Index
>  これって、無意味では?

ComboBoxはコントロール配列で3個設置してあり、Indexに0〜2の値が入っています。
その値をIndexNoに取得する為なのですが、これではダメなのでしょうか?

編集    削除
Say  2004-01-12 04:20:17  No: 111201  IP: [192.*.*.*]

その値をClickイベントプロシージャ外で使ってないなら
Indexをそのまま使えばいいし、
外部で使うためにモジュールレベル変数を使っているのなら
IndexNo = Index 
でいいのでは?

ただ、記述のコードを見る限り、ComboBoxを使う意味がないように思えます。
押したコントロールのIndex値を使うだけなら
Commandボタンで十分ですから・・・。

それとも選択されたComboBoxの値は
どこか他のところで利用しているのでしょうか?

編集    削除
にゃー  2004-01-12 04:39:02  No: 111202  IP: [192.*.*.*]

>それとも選択されたComboBoxの値は
>どこか他のところで利用しているのでしょうか?

はい、利用してるんです。
それより、
Label1.Caption = Table(IndexNo)(0)
の部分の型が一致しませんというエラーが解消できないんです。
やはりTableの宣言の位置が悪いのでしょうか?

編集    削除
Say  2004-01-12 07:40:27  No: 111203  IP: [192.*.*.*]

>Label1.Caption = Table(IndexNo)(0)
>の部分の型が一致しませんというエラーが解消できないんです。

「インデックスが有効範囲にありません」じゃなくって?

イミディエイトウィンドウで
エラー停止時のIndexNoの値を調べ、
異常がなければ
Table(IndexNo)(0)の値を調べてみてください。

編集    削除
しゅう  2004-01-13 01:00:58  No: 111204  IP: [192.*.*.*]

Form_Load()のところが
Form1_Load()になっているって事はないですよねー。

編集    削除