ファイルの操作(Shift-JIS/UTF8対応)[ExcelのVBA]
VB/VBAでファイルを読み書きする方法です。文字コードはShift-JIS、UTF8の両方に対応しています。
事前準備
ファイルを操作する為のサンプルデータのテキストファイルをダウンロードします。文字コードは「Shift-JIS版、UTF8版」の2種類あります。
excel_vba_22_sjis.txt (Shift-JIS版)
excel_vba_22_utf8.txt (UTF8版)
ダウンロードしたテキストファイルは「C:¥」に置きます。
※「C:¥」とはCドライブの直下という意味です。
ファイルの中身は「Shift-JIS/UTF8」共に同じで下記の通りです。
プチモンテ http://www.petitmonte.com/ エクセル講座 http://www.petitmonte.com/excel/excel.html
ファイルの読み込み(Shift-JIS版)
コード
Option Explicit Private Sub CommandButton1_Click() Dim fileNo As Integer ' ファイル番号 Dim buffer As String ' 一時的に文字列を格納 ' ファイルを開く為のファイル番号を取得 fileNo = FreeFile ' 指定されたファイルを開く Open "C:\excel_vba_22_sjis.txt" For Input As #fileNo ' ファイルがEOF(ファイルの終端)になるまでループをする Do Until EOF(fileNo) ' ファイルから一行づつbufferに読み込む Line Input #fileNo, buffer ' 読み込んだ一行をイミディエイトに出力 Debug.Print buffer Loop Close #fileNo End Sub
結果
正常にファイルが読み込めましたね。
次に11行目の「excel_vba_22_sjis.txt」を「excel_vba_22_utf8.txt」に変更すると・・・。
このように「文字化け」してしまいます。これを回避するにはUTF8に対応したテキストファイルの読み込みをしなければいけません。(後述します。)
ファイルの書き込み(Shift-JIS版)
ファイルの書き込みをする前にエクセルを名前を付けて「デスクトップ」に保存してください。サンプルコードを実行するとエクセルのファイルがある同一フォルダ(ここではデスクトップ)にファイルが作成されます。
Private Sub CommandButton2_Click() Dim fileNo As Integer ' ファイル番号 ' ファイルを開く為のファイル番号を取得 fileNo = FreeFile ' 指定されたファイルを開く(ない場合は作成する) Open "Sjisの書き込みテスト.txt" For Output As #fileNo ' 一行毎に文字列を書き込む Print #fileNo, "エクセル講座" Print #fileNo, "http://www.petitmonte.com/excel/excel.html" Close #fileNo End Sub
ファイル操作のまとめ(Shift-JIS版)
Visual Basicでファイルを操作するには「FreeFile」でファイル番号を取得して「Open」でファイルを開きます。「Line Input/Print」でファイルの内容を扱い、最後に「Close」でファイルを閉じます。
Openの書式は次の通りです。
内容 | 備考 |
---|---|
ファイル名 | フルパス名またはファイル名を指定する。フルパス名でない場合はカレントディレクトリからファイルを探す。 |
モード |
Input 入力モード Output 出力モード Append 追記モード Binary バイナリモード |
ファイル番号 | FreeFileで取得したファイル番号を指定する |
ファイルの読み込み(UTF8版)
コード
Private Sub CommandButton3_Click() Dim buffer As String ' 一時的に文字列を格納 Dim Stream As Object ' VB標準のADODB.Streamオブジェクトを作成する Set Stream = CreateObject("ADODB.Stream") ' ストリームの文字コードをUTF8に設定する Stream.Charset = "UTF-8" ' ファイルのタイプ(1:バイナリ 2:テキスト) Stream.Type = 2 ' ストリームを開く Stream.Open ' ストリームにファイルを読み込む Stream.LoadFromFile ("C:\excel_vba_22_utf8.txt") ' ファイルの中身をbufferへ代入 buffer = Stream.ReadText ' ストリームを閉じる Stream.Close ' イミディエイトへ出力 Debug.Print buffer Set Stream = Nothing End Sub
結果
今度は正常にファイルが読み込めましたね。
ファイルの書き込み(UTF8版)
Private Sub CommandButton4_Click() Dim Stream As Object ' VB標準のADODB.Streamオブジェクトを作成する Set Stream = CreateObject("ADODB.Stream") ' ストリームの文字コードをUTF8に設定する Stream.Charset = "UTF-8" ' ファイルのタイプ(1:バイナリ 2:テキスト) Stream.Type = 2 ' ストリームを開く Stream.Open ' ストリームの保存形式をテキスト形式にする Stream.WriteText "エクセル講座" & vbCrLf & "http://www.petitmonte.com/excel/excel.html" ' ストリームに名前を付けて保存する(1は新規作成 2は上書き保存) Stream.SaveToFile ("utf8の書き込みテスト.txt"), 2 ' ストリームを閉じる Stream.Close Set Stream = Nothing End Sub
ファイル操作のまとめ(UTF8版)
ADODB.Streamオブジェクトを使用してファイルを読み込み、書き込みます。「Stream.Charset = "UTF-8"」で文字コードを「UTF8」に指定していますが、他の文字コードに変更するとその文字コードで読み書きが可能です。Shift-JISを扱いたいときは「Shift_JIS」「Shift-JIS」「SJIS」。UTF8は「UTF-8」、EUCは「EUC-JP」、JISは「ISO-2022-JP」となります。
今時は「FreeFile」と「Open」を使ったファイル操作ではなく、ADODB.Streamを使ったファイル操作が主流かも知れません。
メモ
このような場合はWithステートメントを使用するとコードをすっきり出来ます。
Withステートメントはオブジェクト(クラスやコントロール)などに使用することができます。
Visual Basicの基礎
変数/定数/リテラル/データ型/有効範囲
配列/動的配列/構造体/列挙型/エスケープシーケンス
算術演算子/比較演算子/データの型変換
制御構造(If/For/Select/While/Do)
Sub/Functionプロシージャ(手続き/関数)
クラスの作成と使い方
ファイルの操作
エラートラップ
基本のまとめ(上級者用)
エクセル講座のクイックリンク
関連記事
前の記事: | クラスの作成と使い方[ExcelのVBA] |
次の記事: | エラートラップ[ExcelのVBA] |