テキストファイルの操作

【ExcelVBA】テキストファイル(カンマ区切り、タブ区切り)を文字列書式で開くFunctionモジュール

意外にも、テキストファイル(カンマ区切り、タブ区切り)単体で、かつ、文字列書式で開く方法が、ネット上で検索しても見つからなかったので作成してみました。

事前に開いているExcelブック内の1シートとして開く方法は見つかるのですが、テキストファイル単体で開く方法がどうしても見つけられませんでした。

そもそも、何故、テキストファイルを文字列書式で開く必要があるのか?、というと、数値に付いている前ゼロ(03や005など)の「0」が、テキストファイルを開いたときに落ちてしまう、というのが一番の理由になります。

Excelはあくまで表計算ソフトなので、テキストをテキストエディタ以外で開くには注意が必要になります。

1.使用例

1.文字コードがsjisのカンマ区切りファイルを開く場合

C:\Users\都道府県_sjis.csv

todofuken_memo_sjis

Sub main()

    FC_OpenText infile:="C:\Users\都道府県_sjis.csv"
    
End Sub

 
上記のプログラムを実行すると、以下のようにファイルを開きます。
todofuken_sjis

 

2.文字コードがutf8のタブ区切りファイルを開く場合

C:\Users\都道府県_utf8.tsv

todofuken_memo_utf8

Sub main()

    FC_OpenText infile:="C:\Users\都道府県_utf8.tsv", comma:=False, encoding:=65001
    
End Sub

 
上記のプログラムを実行すると、以下のようにファイルを開きます。
todofuken_utf8

 

2.コード

・前ゼロ(ゼロパディング)対応のため、全て文字列として開きます。
・「'」や「"」など、クォテーションで囲われた変数値にも対応しています。
・ブック内の1シートとして開くのではなく、テキスト単体で開きます。

Function FC_OpenText(infile As String, Optional comma As Boolean = True, Optional encoding As Long = 932)
'infile     :対象ファイルをフルパスで指定する。
'comma      :カンマ区切りならTrue、それ以外はタブ区切りとして開く。既定値=True。
'encoding   :読込むファイルの文字コード(sjis=932、utf8=65001)を指定する。既定値=932。

    Const MAX_COL As Long = 16384
    Dim typeArray(1 To MAX_COL) As Variant
    Dim i&
    
    'CSVのExcelへの関連付けが原因で、OpenTextメソッドのfieldinfoプロパティでは書式を制御できない。
    'そのため、後続のQueryTables.Addで、文字列として上書きする処理にした。
    If comma = True Then
        Workbooks.OpenText Filename:=infile, comma:=True, Origin:=encoding
    Else
        Workbooks.OpenText Filename:=infile, Tab:=True, Origin:=encoding
    End If
    
    '書式を標準から文字列に変更するための配列を生成
    For i = 1 To MAX_COL
        typeArray(i) = xlTextFormat
    Next i
    
    '文字列書式で上書きする
    With ActiveSheet.QueryTables.Add(Connection:="text;" & infile, Destination:=Range("A1"))
           
        .TextFilePlatform = encoding
           
        If comma = True Then
            .TextFileCommaDelimiter = True
        Else
            .TextFileTabDelimiter = True
        End If
        
        .TextFileColumnDataTypes = typeArray
        .RefreshStyle = xlOverwriteCells
        .Refresh BackgroundQuery:=False
        .Delete
        
    End With

End Function

-テキストファイルの操作
-, , ,