TOP > カテゴリ > Excel >

ファイルの操作(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

Wikipediaで補足:文字コード Shift-JIS UTF8

ファイルの読み込み(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の書式は次の通りです。

Open ファイル名 For モード As #ファイル番号

内容備考
ファイル名フルパス名またはファイル名を指定する。フルパス名でない場合はカレントディレクトリからファイルを探す。
モード 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を使ったファイル操作が主流かも知れません。

メモ

図はStreamという同一のオブジェクトを複数記述しています。

このような場合はWithステートメントを使用するとコードをすっきり出来ます。

Withステートメントはオブジェクト(クラスやコントロール)などに使用することができます。

Visual Basicの基礎

変数/定数/リテラル/データ型/有効範囲
配列/動的配列/構造体/列挙型/エスケープシーケンス
算術演算子/比較演算子/データの型変換
制御構造(If/For/Select/While/Do)
Sub/Functionプロシージャ(手続き/関数)
クラスの作成と使い方
ファイルの操作
エラートラップ
基本のまとめ(上級者用)

エクセル講座のクイックリンク

ホーム 新機能 基本(初級) 基本(中級) 基本(上級) 関数 マクロ VBA TIPS





関連記事



公開日:2015年06月19日 最終更新日:2015年07月06日
記事NO:01056