他の変換は以下のリンクを参照
このページではUTF-8のファイルをShift-JISに変換する方法を紹介しています。
その他の変換は以下を参照ください。
- VBAでShift-JISのファイルをBOM付きUTF-8に変換する
- VBAでShift-JISのファイルをBOM無しUTF-8に変換する
- VBAでUTF-8のファイルをShift-JISに変換する(当ページ)
- VBAでEUCのファイルをShift-JISに変換する
- VBAでShift-JISのファイルをEUCに変換する
文字コード変換にはActiveX Data Objectsを利用する
VBAの標準機能では文字コードはUnicode(UTF16-LE)とASCIIの2種類が扱えます。
しかし実際に目にするファイルの文字コードはShift-JIS、UTF-8のBOM付き、UTF-8のBOM無し、EUCの4種類になってきます。
そして問題になるのが文字コードの相互変換の方法で、変換が必要な場合にどうやって変換したらいいのか、という点です。
Linuxでは文字コードを変換するnkfコマンドやiconvコマンドがありますが、Windowsの場合は簡単に使えるものがなく、.NetのSystem.Text.Encodingクラス、PerlのEncodeモジュール、PHPのmb_convert_encoding関数、など、どうやって実装しようかなあ、と悩まされる問題があります。ただ、これら.NetもPerlもPHPもプログラミング言語や開発環境のインストールが必要になってくるため、どうしてもハードルが高くなります。
そこでVBAでActiveX Data Objectsを利用しましょう。Excelさえ入っていればインストール不要で文字コード変換が可能です。
なお、上に挙げた.Netは標準でインストール済みのPowerShellでも使えますので、分かる方はそちらでもいいと思います。
事前設定
以下のコードではADODB.Streamを利用するための参照設定が必要です。
VBAの画面で、ツールメニュー→参照設定→Microsoft ActiveX Data Objects x.x Library にチェックを付けます。ここではバージョン6.1ですが、最新バージョンを選択すれば問題ありません。
参照設定を行わない場合はCreateObject関数を利用し、以下のコードの「ADODB.Stream」のオブジェクト変数の初期化の部分を「CreateObject(“ADODB.Stream”)」としてください。
なお、参照設定をした方がわずかではありますが処理速度は速くなります。また、.を入力するとプロパティやメソッドが表示される利点もあります。
UTF-8からShift-JISに変換
文字コードがUTF-8のテキストファイルをShift-JISに変換するマクロです。
変換元のUTF-8のファイルはBOM付きでもBOM無しでもどちらも同様に動作します。
通常、UTF-8のファイルはLinuxのファイルが多く、その場合の改行コードはLFのため、改行コードもWindows用のCRLFに変換するようにしています。変換が不要な場合は後述の説明を参照してください。
関数の引数にファイルのフルパスを渡して使います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
Sub Utf8ToSjis(a_sFrom, a_sTo) Dim streamRead As New ADODB.Stream '// 読み込みデータ Dim streamWrite As New ADODB.Stream '// 書き込みデータ Dim sText '// ファイルデータ '// ファイル読み込み streamRead.Type = adTypeText streamRead.Charset = "UTF-8" streamRead.Open Call streamRead.LoadFromFile(a_sFrom) '// 改行コードLFをCRLFに変換 sText = streamRead.ReadText sText = Replace(sText, vbLf, vbCrLf) sText = Replace(sText, vbCr & vbCr, vbCr) '// ファイル書き込み streamWrite.Type = adTypeText streamWrite.Charset = "Shift-JIS" streamWrite.Open '// データ書き込み Call streamWrite.WriteText(sText) '// 保存 Call streamWrite.SaveToFile(a_sTo, adSaveCreateOverWrite) '// クローズ streamRead.Close streamWrite.Close End Sub |
コードの説明
1行目 | 第一引数に変換元のUTF-8ファイルのフルパスを指定し、第二引数に書き込み先のShift-JISファイルのフルパスを指定します。第一引数のファイルをそのまま変換したい場合は第二引数に第一引数と同じファイルパスを指定しても構いません。 |
2、3行目 | ActiveX Data Objectsのクラス変数のインスタンス変数を作成しています。UTF-8ファイルを読み込む変数と、Shift-JISに変換する先のファイルへの書き込み変数用です。なお、参照設定をしている場合はADODB.Streamの部分はStreamと書いても問題なく動作します。 |
4行目 | 書き込み用のデータを格納する変数です。途中の処理で改行コードの変換を行っています。 |
6行目 | 7行目から10行目は読み込むUTF-8ファイルの設定を行います。 |
7行目 | Typeプロパティにはバイナリモード(adTypeBinary)とテキストモード(adTypeText)の2種類があり、ここではテキストモードを指定しています。 |
8行目 | Charsetプロパティには文字セットを指定します。読み込むファイルがUTF-8のためそのように指定しています。 |
9行目 | データストリームを開きます。ここではまだ引数のUTF-8ファイルは参照していません。 |
10行目 | ファイルの内容をストリームに読み込みます。 |
13行目 | 読み込んだUTF-8ファイルデータを取得します。 |
14行目 | 取得したデータの改行コードのLFをCRLFに置換します。CRLFへの変換が不要な場合は、この行をコメントアウトしてください。 |
15行目 | 変換元のUTF-8ファイルの改行コードがLFではなくCRLFだった場合、14行目での改行コード変換を行うとCR+CR+LFになってしまいます。そのCR+CRを、CRに置換します。CRLFへの変換が不要な場合は、この行をコメントアウトしてください。 |
17行目 | 18行目から26行目は書き込むShift-JISファイルの設定を行います。 |
18行目 | Typeプロパティにはテキストモードを指定しています。 |
19行目 | 書き込むファイルの文字コードであるShift-JISを指定しています。 |
20行目 | データストリームを開きます。ここではまだ引数のShift-JISファイルは指定していません。 |
23行目 | WriteTextメソッドでデータの書き込みを行います。 |
26行目 | コピー後のShift-JISのデータを引数のファイルパスに保存します。 |
29、30行目 | 読み込みデータ、書き込みデータをクローズします。 |
CreateObject関数を利用する場合
CreateObject関数を利用する場合は2行目と3行目を以下のように書き換えます。
1 2 3 4 |
Dim streamRead As Object Dim streamWrite As Object Set streamRead = CreateObject("ADODB.Stream") Set streamWrite = CreateObject("ADODB.Stream") |
以降のコードは変更不要です。
サンプルコード
1 2 3 4 5 6 7 8 |
Sub Utf8ToSjisTest() '// 別ファイルにShift-JISファイルを保存する場合。 Call Utf8ToSjis("C:\web\test\utf8.txt", "C:\web\test\sjis1.txt") '// UTF-8ファイルをそのままShift-JISファイルに変換して保存する場合、 '// 第一引数と同じファイルパスを第二引数にも設定する。 Call Utf8ToSjis("C:\web\test\utf8.txt", "C:\web\test\utf8.txt") End Sub |