スポンサーリンク
前回の記事では、CSVファイルを扱うExcel VBAで、Output構文を使って書き込みを行うソースコードを紹介した。
今回はそれに続き、Input構文を使って、内容の読み込みを行う処理を扱う。
サンプルソースコード:CSVファイルの内容を読み込む
次に示すのは、CSVファイルの内容を1行ずつ読み込んで、それを忠実にExcelのセルに書き込んでいくマクロのサンプルだ。
Input構文に行くまでに Application.FileDialog(msoFileDialogFilePicker) とか使って前準備が回りくどいが、自由にCSVを選んで開く構文にしたいので必要なところ。
他にもちょっと難しい内容を含むけどね。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
Sub inputCSV() '*****CSVファイルの内容を1行ずつ読み込んで、Excelのセルに書き込むマクロ。***** Dim myCSVFile As String With Application.FileDialog(msoFileDialogFilePicker) .Filters.Clear .Filters.Add "CSVファイル", "*.csv" If Not .Show Then Exit Sub myCSVFile = .SelectedItems(1) '選択されたCSVファイル End With Application.ScreenUpdating = False '描画を省略 'Input…入力モード(読み込み) 'Output…出力モード(書き込み) 'Append…追加モード(書き込み) 'CSVファイルを読み込み用で開く Open myCSVFile For Input As #1 Dim arrCommaSplit As Variant Dim var As Variant Dim itemNum As Long Dim r As Long Dim c As Long '*****テキストファイルの内容を1行ずつ読み込むループ処理***** Do Until EOF(1) '#1として開いたテキストファイルの終了までループ Line Input #1, var '読み込み 'カンマ区切りで配列に格納する。 '配列の添字を1開始にするため、先頭に余分なカンマ文字を追加している arrCommaSplit = Split("," & var, ",") 'カンマ区切りによるカラム(項目)の数を取得する。 '毎行の項目数が同じでない場合を考慮し、毎行につき項目数を取得。 itemNum = UBound(arrCommaSplit, 1) r = r + 1 '行数を1追加 For c = 1 To itemNum '配列の値をセルに格納 Cells(r, c).Value = arrCommaSplit(c) Next c Loop '*****ループ処理 ここまで***** Close #1 'CSVファイルを閉じる Application.ScreenUpdating = True '描画を再開 End Sub |
解説
Input でファイルを開き Line Input で内容を1行ずつ読み込む
先述の通り
と、Inputを使ってCSVファイルを開いている。
そして、そのテキストファイル(CSVファイル)の内容を1行ずつ読み込むのが
という構文で、これはもうコピペで使ってしまおう。
実際のところ私は、1行ずつ読み込むよりは一気に全ての内容を読み込む方が好きで、その方法も後ほど紹介する。
さて、ループ処理の最初で
なんていうのがあるけど、EOFというのはEnd Of Fileの略で、ファイルの最後のことだ。
もっともExcel VBAでこのEOFなんていうのを使うのは、私としてもこのテキストファイル読み込み処理のときくらいだ。
ファイルの空き番号とかいうやつを
の構文で1として取得したわけだけど、その番号1を
EOF(1)
と再度書いている。
つまり、ファイル番号=1番として扱ってるファイルの一番最後までということ。
Splitで、カンマ区切りの配列にする
CSVファイルの定義は、各行がカンマ文字によって区切られたファイルだ。
そして、そのような区切り文字で文字を区切る処理に使う定番は、Splitという構文だ。
ここで私は、変数varに対して
“,” & var
と先頭にカンマ文字を付ける処理をわざわざやってて、普通の人はあまりこんなことはしないと思う。
なぜこれをするかというと、変数varがたとえば
var=”2,4,6,8,10″
というカンマ区切りの文字だとして、これを普通にSplitにかけるなら
arrCommaSplit = Split(var, “,”)
となる。
でもこれをすると、Splitされたもの(配列という)の中身は
arrCommaSplit (1)=”4″
arrCommaSplit (2)=”6″
、・・・・・・
というように、0から始まるものに強制的にされてしまう。
これがとっても気持ち悪いので、最初にカンマ文字をわざわざ追加することで、配列の中身が1から始まるものにしているわけだ。
つまり最初にカンマ文字を追加することで、
arrCommaSplit (1)=”2″
arrCommaSplit (2)=”4″
arrCommaSplit (3)=”6″
、・・・・・・
というように、配列の中身を1から開始とみなすことができる。
本当は0から開始だけど、0番は断じて見ないことにする。
そしてUBoundというのを使ってるけど、これが配列の項目数を取得するやつだ。
ただ、arrCommaSplit という配列の数字が0から始まっていると、本当は5個のカラムがある場合でもこのUBoundの結果は4になってしまい、とても面倒なことになる。
だからSplitの先頭にカンマ文字を追加する処理を加えているわけだ。
今回はこの辺りで終了。
InputとOUtputの両方を使うサンプルなど、今後紹介していく。
スポンサーリンク