EXCEL VBAでよく使うものとして、ファイルの内容をEXCELシートに出力する事があると思います。
今回は、ファイルの入出力とEXCELシートへの転記について記事にしようと思います。
ファイルのデータをEXCELシートに転記する
テキストファイルの内容をEXCELのシートに出力する方法です。
サンプルとして入出力用のシートを作ってみました。
画面の仕様は、入力ファイル指定欄C2セルに入力されたファイルをオープンし、項番となる#欄(B6)以降に番号を出力、入力データ表示欄(C:6)以降にファイル内容を出力する。
実行はファイル入力ボタンを押すことで起動される。
プログラミングは以下。
入力ファイル名欄のC2セルの内容をワークエリアに格納し、ファイルオープン。
ファイルオープン後、ファイルEOFまでループし、カウンタとファイルの内容を指定セルに出力。
Sub FileIO_I() Dim Infile As String Dim linecnt As Long Dim strstm As String Infile = Workbooks(1).ActiveSheet.Cells(2, 3) Open Infile For Input As #1 linecnt = 1 Do While (EOF(1) = False) Line Input #1, strstm Workbooks(1).ActiveSheet.Cells(linecnt + 5, 2) = linecnt Workbooks(1).ActiveSheet.Cells(linecnt + 5, 3) = strstm linecnt = linecnt + 1 Loop Close #1 MsgBox ("処理終了") End Sub
入力データの内容は以下。
実行するとこんな感じ
注意点としては、入力ファイルの文字コードがEXCEL VBAではShift-JISしか扱えない為、他の文字コードで作成されたファイルでは文字化けが発生してしまう事。
これについては、後述で対応策を記載します。
EXCELシートのデータをファイルに転記する。
EXCELシートの内容をテキストファイルに出力する方法です。
入出力用のシートの出力側の機能になります。
画面の仕様は、出力ファイル指定欄C3セルに入力されたファイルをオープンし、出力データ欄(D:6)以降の内容をファイル出力する。
実行はファイル出力ボタンを押すことで起動される。
プログラミングは以下
出力ファイル名欄のC3セルの内容をワークエリアに格納し、ファイルオープン。
ファイルオープン後、EXCELシートのD6セル以降でデータが空になるまでループし、EXCELシートのD6以降の内容をファイルに出力。
Sub FileIO_O() Dim Otfile As String Dim linecnt As Long Dim strstm As String Otfile = Workbooks(1).ActiveSheet.Cells(3, 3) Open Otfile For Output As #1 linecnt = 6 strstm = Workbooks(1).ActiveSheet.Cells(linecnt, 4) Do While (Workbooks(1).ActiveSheet.Cells(linecnt, 4) <> "") Print #1, strstm linecnt = linecnt + 1 strstm = Workbooks(1).ActiveSheet.Cells(linecnt, 4) Loop Close #1 MsgBox ("処理終了") End Sub
実行すると、出力ファイル名欄に記載した内容のファイルが作成され、EXCELシートの内容が出力されている。
入力ファイルの文字コード問題
EXCEL VBAは非常に手軽にプログラミングを作成できる代わりに、基本機能で扱える文字コードがShift-JISだけと言う厄介な問題をもっています。
ちなみにVB.netでは入力ファイルの文字コードを指定できる為、この問題は発生しません。
このVBAが旧Visual Basicの流れを汲んでいる為の仕様です。
VBA側だけで対処する場合は、ADO(ActiveX Data Objects)の機能を使用する事で対処は可能ですが、結構メンドクサイです。
個人的に楽なやり方は、入力ファイル自体をバッチファイルを使って文字コード変換してしまうです。
参考にできそうなサイトがあったので紹介します。
Windows10 バッチでnkf(文字コード変換)UTF-8 → Shift-JIS – min117の日記 (hatenablog.com)
実際に上記サイトを参考に作成したバッチファイルが以下
ファイル名:cnv_SJIS.bat
コマンドライン引数の1つ目が入力ファイル、2つ目が出力ファイルにしています。
echo %1 echo %2 powershell -NoProfile -ExecutionPolicy Unrestricted -Command "& { get-content -Encoding UTF8 %1 | Set-Content %2}"
Windowsのコマンドラインで、
“D:\EXCEL VBA\cnv_SJIS.bat” d:\test\IOtest4.txt d:\test\IOtest4.txt_wk
を実行するとSJISに変換できました。
メモ帳の右下でUTF-8となっていたところ、出力ファイルでは、ANSIに変換されています。
コメント