投稿日 | : 2005/07/05(Tue) 08:19 |
投稿者 | : ガッ |
Eメール | : |
URL | : |
タイトル | : Re: 動的二次元配列 |
> CSV形式のファイルからデータを読込み、Excelに帳票出力させようとしています。
>
> こちらの掲示板の過去ログを参考にさせていただいたところ(記事No.3670)、
> Excelに出力するデータを二次元配列に格納して、一気に出力すると高速に
> 処理できる、とのことでしたので、CSVファイルから読込んだデータを一度、
> 二次元配列に格納しようとしています。
>
> CSVファイルの行数が何行あるかわからないため、一行読込むたびに二次元配列を
> 再定義したらよいのではないかと思い、
>
> Dim fnum As Integer
> Dim buf As String
> Dim csv_data() As String
> Dim output_data() As Variant
> Dim cnt As Long
> Dim i As Integer
>
> Do While Not EOF(fnum)
> Line Input #fnum, buf
> csv_data = Split("")
> csv_data = Split(buf, ",")
> If UBound(csv_data) <> -1 Then
> ReDim Preserve output_data(cnt, UBound(csv_data)) As Variant
> For i = 0 To UBound(csv_data)
> output_data(cnt, i) = csv_data(i)
> Next
> cnt = cnt + 1
> End If
> Loop
>
> このようにしてみたところ、1回目のReDimは通るのですが、2回目にReDimしようとすると、
> 「インデックスが有効範囲にありません。」とエラーになってしまいます。
>
> 二次元配列の動的定義の仕方からして間違っているような気がするのですが、
> よい解決方法がありましたら、ご教授いただけないでしょうか?
>
> よろしくお願いします。
MSDNで、"Redim ステートメント"について見ると訳が分かります。
で、このような場合、
・「配列を要素とするユーザ定義型、の配列」を用いる。
・「配列の配列」:ジャグ配列を用いる。
→例えば、[Variant]()の各々の元に[String]()を格納すると、
[Variant](Index)[String](SubIndex)のように取り出せます…きっと。
・そもそも二次元的な配列にしない。
など、色々方法がありえます。