Dim openFileName As String Dim strLine As String Dim strArray() As String '指定のファイルが見つからなければファイル選択 openFileName = ThisWorkbook.Path & "/hoge.csv" If Dir(openFileName) = "" Then openFileName = Application.GetOpenFilename("CSV(コンマ区切り), *.csv, テキスト(タブ区切り), *.txt, すべてのファイル, *.*") If openFileName = "False" Then Exit Sub End If End If 'ファイルを#1として開く Open openFileName For Input As #1 '各行を「,」で分割しデータを取得 Do Until EOF(1) Line Input #1, strLine If strLine <> "" Then strArray = Split(strLine, ",") For i = 0 To UBound(strArray) Debug.Print Replace(strArray(i), """", "") Next End If Loop Close #1
マクロ実行ブックと同じディレクトリに「hoge.csv」があればそのまま開き、無い場合は「ファイルを開く」ウィンドウより選択して開きます。
GetOpenFilename()の引数には、ファイル形式を指定することができます。CSVファイル以外のテキストファイルも想定しています。
指定のファイルを#1として開き、Line Inputで1行ずつ読み込んでいきます。Split関数を使用して「,」で分割してstrArrayに配列として格納します。配列のインデックスは0スタートなので注意。
文字列は「”」で囲まれている場合があるので、Replace関数で取り除いて出力します。
空白行については処理しないようにIfで分岐します。
値に「,」が含まれている場合、Split関数で誤った場所でデータを区切ってしまいますので、関数を使って値以外の「,」をタブ記号 (vbTab) に変換にし、TSVとして扱います。
Sub プロシージャ() strArray = Split(CSVtoTSV(strLine), vbTab) End Sub Function CSVtoTSV(ByVal str As String) As String Dim strTemp As String Dim quotCount As Long Dim i As Long For i = 1 To Len(str) strTemp = Mid(str, i, 1) If strTemp = """" Then quotCount = quotCount + 1 ElseIf strTemp = "," Then If quotCount Mod 2 = 0 Then str = Left(str, i - 1) & vbTab & Right(str, Len(str) - l) End If End If Next i CSVtoTSV = str End Function
CSVファイルの文字コードがUTF-8の場合、そのまま読み込むと文字化けしてしまうため、ADODB.Streamに一度格納して文字コードを指定してから読み込みます。
Dim openFileName As String Dim adoSt As Object Dim strBuf As String Dim strLine() As String Dim strArray() As String '指定のファイルが見つからなければファイル選択 openFileName = ThisWorkbook.Path & "/hoge.csv" If Dir(openFileName) = "" Then openFileName = Application.GetOpenFilename("CSV(コンマ区切り), *.csv, テキスト(タブ区切り), *.txt, すべてのファイル, *.*") If openFileName = "False" Then Exit Sub End If End If 'ADODV.Streamに格納 Set adoSt = CreateObject("ADODB.Stream") With adoSt .Charset = "UTF-8" .Open .LoadFromFile openFileName strBuf = .ReadText .Close End With '1行ずつ処理を行う strLine = Split(strBuf, vbCrLf) For i = 1 To UBound(strLine) If strLine(i) <> "" Then strArray = Split(strLine(i), ",") For j = 0 To UBound(strArray) Debug.Print Replace(strArray(j), """", "") Next j End If Next i
ADODB.Streamのオブジェクトを用意し、文字コードUTF-8で指定のCSVファイルを開きます。
文字列を取得しstrBufに格納、改行コード「vbCrLf」で1行ずつ分割し、且つ「,」でデータを分割します。
ADODB.Streamを使うにはMicrosoft ActiveX Data Objects 2.8 Libraryを有効にする必要があります。
CSVファイルのテキストファイルや、UTF-8以外の文字コードであれば、OpenTextを使用してブックとして開けます。
Dim openFileName As String '指定のファイルが見つからなければファイル選択 openFileName = ThisWorkbook.Path & "/hoge.csv" If Dir(openFileName) = "" Then openFileName = Application.GetOpenFilename("CSV(コンマ区切り), *.csv, テキスト(タブ区切り), *.txt, すべてのファイル, *.*") If openFileName = "False" Then Exit Sub End If End If '引数で文字コードと区切り文字を指定して開く Call Workbooks.OpenText(openFileName, Origin:=65001, Comma:=True)
第2引数で文字コード、第3引数で区切り文字を指定します。
文字コード | 値 |
---|---|
Shift-JIS | 932 |
UTF-8 | 65001 |
UTF-16 | 1200 |
区切り文字 | 値 |
---|---|
カンマ | Comma:=True |
タブ | Tab:=True |
セミコロン | Semicolon:=True |
スペース | Space:=True |
その他 | Other:=True, OtherChar:=“hoge” |