投稿時間: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ファイルのデータが数千行以上存在しても、それなりに高速に 動かしたいので、できたら二次元配列を使用したいと考えています。
せっかく教えていただいたのに、わがまま言ってすみません。
|