csvファイルなどテキストファイルを読み込みするとき、1行目が項目行の場合、そこはインポートしなくていいんだけどな、というときがあります。特に、連続してcsvファイルを読み込みするときなど。
いつも、Line Input #1 とかでテキストファイルの読み込みをやってます。
で、もし項目行と判定できたら読み込みしない、とかしてました。
ふとネットでもっと良い方法をみかけたのでこれだ~採用~と思ったので、備忘録として記録しておきたくここに書きます。
この1組、2組、3組というファイル名のcsvファイルを読み込みします。
まず、こう書きました。
Sub Sample()
Dim path As String
path = “C:\Users\81907\Documents\” ‘csvファイルの保存してあるパス
Dim vFile As String
vFile = Dir(path & “*組.csv”) ‘〇組というファイルを次々開く
Dim buf As String ‘csvファイル1行分を受け取る変数
Dim tmp As Variant ‘1行分をカンマで分割し配列で受け取る
Dim i As Long: i = 1 ‘Excel出力行
Do Until vFile = “” ‘〇組というcsvファイルがなくなるまで繰り返し
Open path & vFile For Input As #1 ‘csvファイル開く
Do Until EOF(1) ‘csvファイルの最後の行まで
Line Input #1, buf ‘1行分を変数bufで受け取り
tmp = Split(buf, “,”) ‘bufをカンマで分割し配列tmpで受け取る
Cells(i, 1).Value = tmp(0) ‘1列目クラス
Cells(i, 2).Value = tmp(1) ‘2列目氏名
Cells(i, 3).Value = tmp(2) ‘3列目身長
Cells(i, 4).Value = tmp(3) ‘4列目体重
i = i + 1 ‘Excelの行をカウントアップ
Loop ‘csv次の行へ
Close #1 ‘csvファイル閉じる
vFile = Dir() ‘次のファイルを変数vFileで受け取り
Loop
End Sub
こうなっちゃいました。それぞれのファイルの項目名が入っちゃいました。
受け側のファイルに最初から項目名を用意しておいて、csvファイルは1行目の項目行を飛ばして2行目から読み込みすることにします。
変更したのは赤いところです。
Sub Sample()
Dim path As String
path = “C:\Users\81907\Documents\” ‘csvファイルの保存してあるパス
Dim vFile As String
vFile = Dir(path & “*組.csv”) ‘〇組というファイルを次々開く
Dim buf As String ‘csvファイル1行分を受け取る変数
Dim tmp As Variant ‘1行分をカンマで分割し配列で受け取る
Dim i As Long: i = 2 ‘Excel出力行。2行目から出力
Do Until vFile = “” ‘〇組というcsvファイルがなくなるまで繰り返し
Open path & vFile For Input As #1 ‘csvファイル開く
‘※最初に1行読んじゃう
Line Input #1, buf
‘2行目から最後の行まではExcelに出力する
Do Until EOF(1) ‘csvファイルの最後の行まで
Line Input #1, buf ‘1行分を変数bufで受け取り
tmp = Split(buf, “,”) ‘bufをカンマで分割し配列tmpで受け取る
Cells(i, 1).Value = tmp(0) ‘1列目クラス
Cells(i, 2).Value = tmp(1) ‘2列目氏名
Cells(i, 3).Value = tmp(2) ‘3列目身長
Cells(i, 4).Value = tmp(3) ‘4列目体重
i = i + 1 ‘Excelの行をカウントアップ
Loop ‘csv次の行へ
Close #1 ‘csvファイル閉じる
vFile = Dir() ‘次のファイルを変数vFileで受け取り
Loop
End Sub
イエ~イ。できました!
1つ目のファイルは項目行を出力、2つ目以降は2行目から、という場合は、いろいろ考えられますが、
flagという目印変数を用意。初期値False
1ファイル読み込み後はflagをTrueにする
flagがFalseの場合は1行目から読込・出力、flagがTrueの場合は2行目から読込・出力する。
ということにしました。
Sub Sample()
Dim path As String
path = “C:\Users\81907\Documents\” ‘csvファイルの保存してあるパス
Dim vFile As String
vFile = Dir(path & “*組.csv”) ‘〇組というファイルを次々開く
Dim buf As String ‘csvファイル1行分を受け取る変数
Dim tmp As Variant ‘1行分をカンマで分割し配列で受け取る
Dim i As Long: i = 1 ‘Excel出力行
Dim flag As Boolean: flag = False ‘目印。ファイル2つ目以降はTrueにする
Do Until vFile = “” ‘〇組というcsvファイルがなくなるまで繰り返し
Open path & vFile For Input As #1 ‘csvファイル開く
‘※2回目以降、最初に1行読んじゃう
If flag = True Then
Line Input #1, buf
End If
‘1つ目のファイルは1行目から、
‘2つ目のファイルからは2行目から
Do Until EOF(1) ‘csvファイルの最後の行まで
Line Input #1, buf ‘1行分を変数bufで受け取り
tmp = Split(buf, “,”) ‘bufをカンマで分割し配列tmpで受け取る
Cells(i, 1).Value = tmp(0) ‘1列目クラス
Cells(i, 2).Value = tmp(1) ‘2列目氏名
Cells(i, 3).Value = tmp(2) ‘3列目身長
Cells(i, 4).Value = tmp(3) ‘4列目体重
i = i + 1 ‘Excelの行をカウントアップ
Loop ‘csv次の行へ
Close #1 ‘csvファイル閉じる
‘flagをTrueにする
flag = True
vFile = Dir() ‘次のファイルを変数vFileで受け取り
Loop
End Sub
以上です。
ありがとうございました。
コメント