意外にも、テキストファイル(カンマ区切り、タブ区切り)単体で、かつ、文字列書式で開く方法が、ネット上で検索しても見つからなかったので作成してみました。
事前に開いているExcelブック内の1シートとして開く方法は見つかるのですが、テキストファイル単体で開く方法がどうしても見つけられませんでした。
そもそも、何故、テキストファイルを文字列書式で開く必要があるのか?、というと、数値に付いている前ゼロ(03や005など)の「0」が、テキストファイルを開いたときに落ちてしまう、というのが一番の理由になります。
Excelはあくまで表計算ソフトなので、テキストをテキストエディタ以外で開くには注意が必要になります。
目次
1.使用例
1.文字コードがsjisのカンマ区切りファイルを開く場合
C:\Users\都道府県_sjis.csv
Sub main()
FC_OpenText infile:="C:\Users\都道府県_sjis.csv"
End Sub
上記のプログラムを実行すると、以下のようにファイルを開きます。
2.文字コードがutf8のタブ区切りファイルを開く場合
C:\Users\都道府県_utf8.tsv
Sub main()
FC_OpenText infile:="C:\Users\都道府県_utf8.tsv", comma:=False, encoding:=65001
End Sub
上記のプログラムを実行すると、以下のようにファイルを開きます。
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