AccessのVBAでファイルの文字コードを変換するサンプルプログラムを覚書。
ファイルの文字コード変換自体はフリーソフトとか使えば簡単に出来るのですが、どうしてもプログラム中でファイルの文字コードを変換しつつ処理を実行する必要があったため作成しました。
実際には別のプログラムからこのプログラムを呼び出して大量にあるテキストファイルの文字コードを変換しつつ処理をするプログラムを作成しましたが、この記事では文字コード変換部分だけを覚書しておきます。
このプログラムを動作せる前提として、ADODBオブジェクトを使用するので参照設定で"Microsoft ActiveX Data Object Library"にチェックを付けておく必要があります。
"Microsoft ActiveX Data Object Library"は、複数のバージョンが選択できる場合がありますが、その際は一番バージョン番号が高いものにチェックを付ければよいです。
サンプルプログラムは、AccessのVBAで記載されていますが、基本的にはExcelのVBAでも使用できます。
ExcelのVBAで使用する際も参照設定を忘れないようにしてください。
文字コードを変換するサンプルプログラムの処理概要
このプログラムの処理の考え方としては、以下のとおりです。
- 元々のテキストファイルの文字コードと同じ"箱"と変換したい文字コードの"箱"の2つを用意する。
- 元々の文字コードの"箱"に一旦ファイルの中身を入れる。
- 元々の文字コードの"箱"の中身を別で用意した変換したい文字コードの箱に移しかえる
文字コードを変換するVBAのサンプルプログラム
以下に文字コードを変換するサンプルプログラムを記載します。
Public Sub Cnv_CCode(fConvFileName As String, strBeforeCode As String, strAfterCode As String)
Dim BeforeStream As New ADODB.Stream, AfterStream As New ADODB.Stream
Dim CheckStream As New ADODB.Stream
Set BeforeStream = CreateObject("ADODB.Stream")
BeforeStream.Charset = strBeforeCode
Call BeforeStream.Open
Set AfterStream = CreateObject("ADODB.Stream")
AfterStream.Charset = strAfterCode
Call AfterStream.Open
Call BeforeStream.LoadFromFile(fConvFileName)
Call BeforeStream.CopyTo(AfterStream)
Call AfterStream.SaveToFile(fConvFileName , adSaveCreateOverWrite)
Call AfterStream.Close
Call BeforeStream.Close
Set AfterStream = Nothing
Set BeforeStream = Nothing
End Sub
サンプルプログラムの使い方
使い方としては、変更前の文字コードと変換後の文字コードを引数として指定して別のプロシージャから呼び出して実行する。
例えば、元のファイルが"EUC-JP"で、それを"UTF-8"に変更したい場合は、以下のようにCallで呼び出して実行すれば良い。
上書きされるので試すときは必ずバックアップをとっておくこと!
呼び出す側のプロシージャの例
以下に文字コードを変換するサンプルプログラムを呼び出す側のプロシージャの例を記載しておきます。
Sub test()
Call Cnv_CCode("C:¥temp¥hogehoge.txt", "EUC-JP", "UTF-8")
End Sub
変換前のファイルが本当に指定した文字コードかどうかをチェックした上で呼び出すことが望ましいので、文字コードをチェックするプログラムも同時に作ったのですが、そのプログラムについては、別の記事で紹介します。
ちなみに単にファイルの文字コードを変換したい(自動じゃなくて良い)のであれば、以下のフリーソフトが超絶便利なのでこちらを使いましょう。
ファイルが多量にあっても一括して変換してくれるし高速です。
大変お世話になっているとても良いソフトです。
コメント
サンプルプログラム ありがとうございます。
15行めの引数は
誤:Call BeforeStream.LoadFromFile(fAfterFileName)
正:Call BeforeStream.LoadFromFile(fConvFileName)
ですね?
コメントと指摘ありがとうございます。
fAfterFileName = fConvFileName としているので間違いではないのですが、意味がなかったですね。
わかりやすいようにサンプルプログラムを変更しました!