make is.dev make it simple. development.
2024年9月22日

CSVファイルを開く

OpenText を使ったCSVファイルを開くEXCEL VBAのサンプルを紹介。

CSVファイルは普通にEXCELで開くと数字の頭0が消えたり、計算式が勝手に計算されたりと、用途によっては開くだけで難義する。
これを回避するため、VBAを使ってファイルを開く。

ただし、この方法は対応しているデータの内容に制限があるので、利用シーンに注意が必要。

使用環境

・ Windows 11
・ Microsoft EXCEL 2019

対応するCSV

・ 文字コードはUTF-8(BOMなし)のみ
・ 改行コードはCRLF、LFどちらも可
・ セル内改行はダメ。存在すると文字化けが発生し、正しく読み込めない
・ 囲み文字のエスケープは二重化(EXCELルール)

サンプルコード

Sub sample()
    
    ' UTF-8(BOMあり)のみ開ける
    ' セル内改行があるとダメ
    ' CRLF、LFはどちらも大丈夫
    
    
    ' 型指定する列数を設定
    Const columns As Integer = 100
    
    
    ' 全列テキスト形式での読み込みを指定
    Dim arrFieldInfo As Variant
    arrFieldInfo = Array()
    ReDim Preserve arrFieldInfo(columns - 1)
    
    Dim i As Integer
    For i = 0 To columns - 1
        arrFieldInfo(i) = Array(i + 1, xlTextFormat)
    Next i
    
    
    ' CSVファイルを開く
    Workbooks.OpenText Filename:=Environ("USERPROFILE") & "\Desktop\" & "sample.csv", _
        Origin:=65001, _
        StartRow:=1, _
        DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, _
        ConsecutiveDelimiter:=False, _
        Tab:=False, _
        Semicolon:=False, _
        Comma:=True, _
        Space:=False, _
        Other:=False, _
        fieldInfo:=arrFieldInfo, _
        TrailingMinusNumbers:=False

End Sub
VB

とりあえず100列をテキスト形式指定して読み込む例。
読み込む列数が少なくても問題はないが、多い場合は指定が足りず途中から標準形式になる。
かといって、全列指定するには配列が大きくなりすぎるので、、、。

テキスト形式を指定しているのは、数字の頭0が消えたり、計算式が勝手に計算されることを回避するため。
テキスト形式以外を指定する場合の指定値は、以下を参照。

https://learn.microsoft.com/ja-jp/office/vba/api/excel.xlcolumndatatype

いずれにしても、型指定部はサンプル通りではなく読み込むファイル内容に合わせて調整が必要。

パラメータのOriginで65001(UTF-8)を指定しているが、仮にここで932(SJIS)を指定しても正しく動かない。
(SJISだとEXCELが普通に開いてしまい、上記型の指定が利かない)

また、UTF-8のBOMなしでは文字化けするので、予めBOMを付けておく必要がある。

CSVの読み込みとして上記記載しているが、例えばTSVの場合はパラメータのTabをtrueにするなどで、区切り文字を調整出来る。