iEhohs DokuWiki

プログラミングや設定方法など、個人的なナレッジを残しておくWikiです。

ユーザ用ツール

サイト用ツール


excel:vba-open-csv

CSVファイルを開くVBA

Line Inputで開く

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で分岐します。

CSVファイルをTSVファイルに変換

値に「,」が含まれている場合、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

ADODB.Streamを使ってUTF-8のCSVファイルを読み込む

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行ずつ分割し、且つ「,」でデータを分割します。

Microsoft ActiveX Data Objects 2.8 Library を有効にする

ADODB.Streamを使うにはMicrosoft ActiveX Data Objects 2.8 Libraryを有効にする必要があります。

  1. VBEを起動
  2. ツール
  3. 参照設定
  4. Microsoft ActiveX Data Objects 2.8 Libraryにチェックを入れる

OpenText で形式と文字コードを指定してテキストファイルをブックとして開く

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-JIS932
UTF-865001
UTF-161200
区切り文字
カンマComma:=True
タブTab:=True
セミコロンSemicolon:=True
スペースSpace:=True
その他Other:=True, OtherChar:=“hoge”
スポンサーリンク
excel/vba-open-csv.txt · 最終更新: 2024/07/26 10:43 by shimehitsu14