投稿日 | : 2005/07/05(Tue) 09:28 |
投稿者 | : はこ |
Eメール | : |
URL | : |
タイトル | : Re^2: 動的二次元配列 |
ガッさん。
おはようございます。
ご回答どうもありがとうございます。
MSDNもチェックせずに質問してすみませんでした。
> ・「配列を要素とするユーザ定義型、の配列」を用いる。
ユーザ定義型を標準モジュールでこのように定義して、
Public Type CSV_INFO
csv_buf() As String
End Type
Public CSVInfo() As CSV_INFO
先ほどのソースを、
Dim fnum As Integer
Dim buf As String
Dim csv_data() As String
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 CSVInfo(cnt) As CSV_INFO
ReDim Preserve CSVInfo(cnt).csv_buf(UBound(csv_data)) As String
CSVInfo(cnt).csv_buf = csv_data
cnt = cnt + 1
End If
Loop
というように修正したら、ユーザ定義型配列CSVInfo()にはCSVファイルのデータが
ちゃんと格納されるのですが、それをいざExcelファイルに出力しようと、
xlsSheet.Range("$A$2") _
.Resize(UBound(CSVInfo) + 1, UBound(CSVInfo(0).csv_buf) + 1) _
.Value = CSVInfo
としたところ、コンパイルエラー「パブリックオブジェクトモジュールで定義された
ユーザー定義型に限り、変数に割り当てることができ、実行時バインディングの
関数に渡すことができます。」が発生してしまいました。
そこで、
> ・「配列の配列」:ジャグ配列を用いる。
> →例えば、[Variant]()の各々の元に[String]()を格納すると、
> [Variant](Index)[String](SubIndex)のように取り出せます…きっと。
これを実験してみようと、
Dim fnum As Integer
Dim buf As String
Dim csv_data() As String
Dim cnt As Long
Dim i As Integer
Dim tbl() As Variant
Dim csv_buff() As String
Do While Not EOF(fnum)
Line Input #fnum, buf
csv_data = Split("")
csv_data = Split(buf, ",")
If UBound(csv_data) <> -1 Then
ReDim Preserve tbl(cnt) As Variant
ReDim Preserve csv_buff(UBound(csv_data)) As String
csv_buff = csv_data
tbl(cnt) = csv_buff
cnt = cnt + 1
End If
Loop
このようにソースを修正したところ、ジャグ配列tbl()()にはCSVファイルのデータが
ちゃんと格納されたのですが、いざExcelファイルに出力しようと、
xlsSheet.Range("$A$2").Resize(UBound(tbl) + 1, UBound(tbl(0)) + 1).Value = tbl
としたところ、Excelファイルには何も出力されませんでした。
(エラーは何も発生しなかったのですが。)
> ・そもそも二次元的な配列にしない。
CSVファイルのデータが数千行以上存在しても、それなりに高速に
動かしたいので、できたら二次元配列を使用したいと考えています。
せっかく教えていただいたのに、わがまま言ってすみません。