◆CSVファイルの読み込み
CSVとは、Comma Separated Value の略で 、項目間をカンマで区切ったテキストファイル
のことを指します。
他のシステムで作成されたデータをExcelに取り込む場合や、Excelで作成したデータを
他のシステムに引き渡す場合などに使われるデータ形式です。
ここで説明するサンプルは、1行の項目数がどの行でも同じでないと正しく読み込めま
せん。
ファイルの読み込み用のステートメントを下の表にまとめました。
Get | 読み込む位置を指定できます。ランダムにアクセスできます。 |
Input | 読み込む文字数を指定します。改行も読めます。 |
Input # | カンマで区切られた1単語づつ読み込みます。 |
Line Input # | 1行読み込みます |
1行の項目数は、Function GetItemNum で自動で判定するようにしています。
1行の区切りは改行で認識するのですが、Input # を使用してカンマで区切られた単語
を1つづつ読んでいたのでは改行が読めません。かといって Input でちまちまと
読んでいては時間がかかります。
そこで、最初の1行だけ Line Input # を使って読んで、1行の中のカンマを数えて
います。
読み込んだデータは配列に入れて、セル(表)に一気に代入しています。
example18 をダウンロードして動作を確認してください。
Sub CSV_Read()
Dim FileType, Prompt As String
Dim FileNamePath As Variant
Dim csvline() As String
Dim i, Rowcnt, ColumNum As Integer
Dim ch1 As Long
FileType = "CSV ファイル (*.csv),*.csv"
Prompt = "CSV File を選択してください"
FileNamePath = SelectFileNamePath(FileType, Prompt)
If FileNamePath = False Then
End
End If
ColumNum = GetItemNum(FileNamePath)
ReDim csvline(1 To ColumNum)
ch1 = FreeFile
Open FileNamePath For Input As #ch1
On Error GoTo CloseFile
Rowcnt = 1
Do While Not EOF(ch1)
For i = 1 To ColumNum
Input #ch1, csvline(i)
Next
Range(Cells(Rowcnt, 1), Cells(Rowcnt, ColumNum)) = csvline()
Rowcnt = Rowcnt + 1
Loop
CloseFile:
Close #ch1
End Sub
Function GetItemNum(FileNamePath) As Integer
Dim ch1 As Long
Dim textline As String
ch1 = FreeFile
Open FileNamePath For Input As #ch1
Line Input #ch1, textline
Close #ch1
GetItemNum = 1
Do
GetItemNum = GetItemNum + 1
textline = Mid(textline, InStr(textline, ",") + 1)
Loop Until InStr(textline, ",") = 0
End Function
Function SelectFileNamePath(FileType, Prompt) As Variant
SelectFileNamePath = Application.GetOpenFilename(FileType, , Prompt)
End Function
上記の方法は、1行の中のカンマを数える方法ですが、かっこ悪いですね。
もっとスマートに読み込む方法を教えていただいたので紹介します。
Sub CSV_Read2()
Dim FileType, Prompt As String
Dim FileNamePath As Variant
Dim textline, csvline() As String
Dim Rowcnt, ColumNum As Integer
Dim ch1 As Long
FileType = "CSV ファイル (*.csv),*.csv"
Prompt = "CSV File を選択してください"
FileNamePath = SelectFileNamePath(FileType, Prompt)
If FileNamePath = False Then
End
End If
ch1 = FreeFile
Open FileNamePath For Input As #ch1
On Error GoTo CloseFile
Rowcnt = 1
Do While Not EOF(ch1)
Line Input #ch1, textline
textline = Replace(textline, """", "")
csvline() = Split(textline, ",")
Range(Cells(Rowcnt, 1), _
Cells(Rowcnt, UBound(csvline()) + 1)) = csvline()
Rowcnt = Rowcnt + 1
Loop
CloseFile:
Close #ch1
End Sub