⇒ エクセルでTXT(テキストファイル)を開く手順!失敗する原因は?
他のシステムで処理したデータをエクセルに取り込み、独自に加工するにはテキストファイルが便利です。
テキストファイルの中でも、エクセルと相性が良いのはカンマ区切りのCSVファイルです。
ここでは、エクセルVBAプログラムでCSVファイルを処理する方法を見ていきたいと思います。
この記事の内容
エクセルVBAでCSV(テキストファイル)を開くサンプルプログラム
CSVファイルをエクセルで開く簡単な方法は、ワークブックとして開いてしまいます。
Workbooks.Open "C:\Users\owner\Desktop\sample.csv"
この一文でデスクトップに保存されているCSVファイルが開きます。
エクセルでCSVファイルを開くのと同じ処理ですね。
読み込んだ後に、何か処理するプログラムを付け足せば、他のシステムと連携させる事ができます。
テキストファイルを開く時は文字化けしないか要注意
CSVファイルはカンマ(,)で区切られたテキストファイルです。
テキストファイルの中には、スペースやタブで区切られた形式や、桁数が決まった固定長のデータもあります。
エクセルではCSVでなくても、他の区切り文字や固定長ファイルも開く事ができます。
厄介なのは、文字コードが違うテキストファイルを開く時です。
いわゆる文字化けってやつですね。
シフトJISコードのテキストファイルであれば、エクセルで開いても文字化けしません。
しかし、他の文字コードの時は文字化けしていまう事もあります。
特にWEBシステムでよく使われている、UTF-8で保存したテキストファイルをエクセルで開くと以下のようになります。
こうした時は、ファイルを開く時のウィザード画面で、文字コードを指定すると正しく開く事ができます。
ファイル出力する基幹システム側でシフトJISに保存してくれれば良いのですが、そうでなければ受取側で処理するしかありません。
CSVファイルを開く時に前0が消えてしまう時の対処
エクセルでCSVなどのテキストファイルを開く時、前0が消えてしまう時があります。
例えば、0001 というデータが 1 と表示されていますような場合です。
エクセルでは、データを読み込む時、自動でデータ型を判定してしまうので、数字が並んだ状態だと数値型として認識します。
このため、読み込む時に文字型として指定するか、取り込んだ後にエクセルの表示形式を前0にするか、決めなければいけません。
文字型として読み込む場合
データを文字列として取り込む時は、ウィザード画面を使います。
【データ型検出】を「データ型を検出しない」にして、データを読み込みます。
表示形式を前0にする場合
データを読み込んだ後に表示形式を変更して前ゼロにする時は、セルの書式設定画面をを使います。
変更したいセル範囲を選択して[Ctrl]を押しながら1を押すとセルの書式設定画面が表示されます。
ユーザー定義に"0000"を追加して、前0にしました。
エクセルVBAでCSV(テキストファイル)に保存するサンプルプログラム
エクセルシートのデータをCSV形式で保存するエクセルVBAプログラムコードの例です。
エクセルシートはこんな感じです。
3列あり、日付、部門、金額の項目です。
データは連続してあり、何行あるのかわかりません。
1行目はタイトルです。
CSVファイルには不要です。
日付は、8桁で、前0詰めです。
部門は、3桁で、前0詰めです。
この桁数は、基幹システムに取り込むときに必須となるので、CSVファイルに保存する時に編集します。
この条件で私が作ったVBAプログラムコードはこんな感じです。
Private Sub sample_xls_csv()
Dim csvFilePath As String
Dim iCount As Long
Dim maxRow As Long
Dim fileNo As Integer
Dim FileName As String
Dim strCells As String
' ファイル名の取得(拡張子を除く)
FileName = Left(ActiveWorkbook.Name, InStrRev(ActiveWorkbook.Name, ".", -1, vbTextCompare) - 1)
' CSVファイルパスの作成
csvFilePath = ActiveWorkbook.Path & "\" & FileName & ".CSV"
' 最終行を調べる
maxRow = ActiveSheet.Range("A1").End(xlDown).Row
' ファイル番号を取得
fileNo = FreeFile
' ファイル開く
Open csvFilePath For Output As #fileNo
' 縦方向ループ(最終行まで)
For iCount = 2 To maxRow
strCells = Format(Cells(iCount, 1), "00000000")
strCells = strCells & "," & Format(Cells(iCount, 2), "000")
strCells = strCells & "," & Cells(iCount, 3)
Print #fileNo, strCells
Next iCount
' ファイルを閉じる
Close #fileNo
' 処理終了メッセージ
MsgBox ("CSV出力しました。" & vbLf & vbLf & varFile)
End Sub
エクセルVBAには、テキストファイルで保存する関数もありますが、日付や部門に桁数の指定などがあったので、Print文を使ってファイル出力しています。
VBAというより、VBの基本的なファイル操作のプログラムになりました。
Forループの処理が苦手です。
いつもわからなくなるので、最初の段階で最終行を明示して処理させています。
エクセルVBAっぽい感じの処理といえば、最終行を調べるあたりですね。
データを加工しやすいエクセルで処理するメリット
エクセルでテキストファイルを処理できるようになると、業務の自動化がやりやすくなります。
普段から使い慣れたソフトなので、多くの人と共有しやすくなります。
CSVファイルを読み込むサンプルマクロを作成しました。
CSVファイル変換
圧縮ファイルをダウンロードして頂き、解凍してご利用ください。
誠に勝手ですが、不具合も含めて無償サポートはしていません。
有料でのサポートは、ご依頼いただければ検討させて頂きます。