大体でIT

-ちょっと使えるネタを紹介-

大体でIT

Excel VBAでテキストファイルの形式をUTF-8、Shift-JIS、UTF-8(BOM付き)へ変換する方法についてご紹介します。Windows10でメモ帳のデフォルトがUTF-8になったのでUTF-8形式へ統一したい、CSVの表示が文字化けしてしまったからファイル形式を変更したいといった場合に参考になります。

はじめに

この記事ではUTF-8、UTF-8(BOM付き)、Shift-JIS形式のファイルをこれら3つの形式へ変換する方法についてご紹介します。

今現在使っているテキストファイルの形式をUTF-8形式のテキストファイルへ統一したい、とか文字化けしてしまったからそれを解消したいといった場合に使えます。

大量のテキストファイルの形式を変換したい場合には今回ご紹介するExcel VBAでテキストファイル形式を変換する方法が必要になってきます。

手作業で変換することはもちろんできますがかなり時間がかかってしまいます。その場合はExcel VBAでの出番です。

この記事で紹介すること

  • UTF-8へ変換
  • Shift-JISへ変換
  • UTF-8(BOM付き)へ変換

目次から見たい項目へ移動すると便利ですよ。

目次

テキストファイルの形式

テキストファイルには複数の形式があります。

1種類にだったらいいのにと思いますが残念ながら私たちが使うテキストファイルには複数の形式があります。

今回はたくさんある形式の中からよく使われるテキストファイルの形式について3つピックアップしました。

それがこちらです。

  • Shift-JIS
  • UTF-8
  • UTF-8(BOM付き)

テキストファイルとは.txt, .csv, .html, .cssなどの拡張子となっているファイルです。

とりあえずこの3つのデータ形式について覚えておけばテキストファイルを扱う上では問題ないです。

私自身この3つしか扱ったことがありません。

簡単にこれら3つのデータがどのような場面で使われるかについてご説明します。

説明する内容はそうだったんだぐらいの話なので特に使われる場面とか知る必要ないという方は読み飛ばして変換のVBAコードに進むといいです。

Shift-JIS

Shift-JISはWindows7でメモ帳のデフォルトの形式になっていました。

Shift-JISはExcel VBAやCSVファイルなどで使われる形式になります。

Excel VBAやCSVファイルでUTF-8やUTF-8(BOM付き)形式のデータを開くと文字化けしてしてしまいます。

メモ帳ではANSIと記載されていて、Shift-JISとANSIは同じと考えていいです。

UTF-8

UTF-8はWindows10のメモ帳でデフォルトになっている形式です。

なのでメモ帳を開いて文章を記載するとその形式はUTF-8になります。

UTF-8(BOM付き)というのがありますが、UTF-8はBOMなしの形式です。

Webページを作成する際に使われるHTMLやCSSの多くはUTF-8形式となっています。

UTF-8はテキストファイルの中でスタンダードになっています。

UTF-8(BOM付き)

UTF-8(BOM付き)は以前のWindows10でメモ帳のデフォルトになっていたものです。

なので以前のWidowsでテキストファイルを作成していた場合その形式がUTF-8(BOM付き)になっている場合があります。

UTF-8(BOM付き)はUTF-8形式の先頭の3バイトがBOMになっていてそれがUTF-8との違いになります。

BOMとはこのファイルがUTF-8形式ですよとそのファイルを読み込むアプリケーションに宣言するデータです。

VBAでShift-JISへ変換

では本題に入ります。

Excel VBAでUTF-8もしくはUTF-8(BOM付き)をShift-JISへ変換するVBAコードを説明します。

CSVファイルで文字化けしちゃった場合にShift-JISへ変換して文字化けを直したいといった場合に使えます。

変換前ファイルがUTF-8もしくはUTF-8(BOM付き)のどちらでも同じコードで実行できます。

UTF-8もしくはUTF-8(BOM付き)をShift-JISへ変換

UTF-8もしくはUTF-8(BOM付き)をShift-JISへ変換するVBAコードはこちらです。

'UTF-8、UTF-8(BOM付き)⇒Shift-JIS
Sub TEST1()
    
    '変換したいテキストファイルのファイルパスを作成
    Dim FilePath
    FilePath = ThisWorkbook.Path & "\TEST.txt"
    
    'UTF-8もしくはUTF-8(BOM付き)のテキストファイルを読み込み
    With CreateObject("ADODB.Stream")
        .Charset = "UTF-8"
        .Open
        .LoadFromFile FilePath
        a = .ReadText
        .Close
    End With
    
    'UTF-8もしくはUTF-8(BOM付き)以外を読み込んでしまった場合は終了
    For i = 1 To Len(a)
        If Mid(a, i, 1) <> Chr(63) Then
            If Asc(Mid(a, i, 1)) = 63 Then
                Exit Sub
            End If
        End If
    Next
    
    '改行毎にデータを分ける
    b = Split(a, vbLf)
    
    'Shift-JIS形式でテキストファイルへ出力
    Open FilePath For Output As #1
        For i = 0 To UBound(b)
            Print #1, b(i)
        Next
    Close #1

End Sub

最初にUTF-8もしくはUTF-8(BOM付き)のテキストファイルを読み込んでいます。

次に読み込んだデータをShift-JIS形式でテキストファイルへ出力しています。

これでUTF-8もしくはUTF-8(BOM付き)をShift-JIS形式へ変換することができます。

VBAコードを実行してみます。

UTF-8形式のテキストファイルを用意しました。

UTF-8形式のテキストファイル

UTF-8形式のテキストファイル

Shift-JISへ変換するVBAコードを実行します。

UTF-8⇒Shift-JISへ変換

UTF-8形式のテキストファイルをShift-JISへ変換する

UTF-8形式ファイルをShift-JIS形式へ変換することができました。

UTF-8(BOM付き)のテキストファイルでも同じようにShift-JISへ変換できます。

UTF-8(BOM付き)のテキストファイル

BOM付きUTF-8形式ファイル

Shift-JISへ変換してみます。

UTF-8(BOM付き)⇒Shift-JISへ変換

BOM付きUTF-8をShift-JISへ変換

UTF-8(BOM付き)をShift-JISへ変換できました。

VBAでUTF-8へ変換

Excel VBAでShift-JISもしくはUTF-8(BOM付き)をUTF-8形式へ変換するVBAコードをご紹介します。

こちらも先ほどの変換と似たようなVBAコードになります。

必要な変換のところだけを参考にするといいです。

これは使わないなというところは読み飛ばしてください。

Shift-JISをUTF-8へ変換

Shift-JISをUTF-8へ変換するVBAコードです。

'Shift-JIS⇒UTF-8
Sub TEST2()
    
    '変換したいテキストファイルのファイルパスを作成
    Dim FilePath
    FilePath = ThisWorkbook.Path & "\TEST.txt"
    
    'Shift-JIS形式のテキストファイルを取得
    a = ""
    i = 0
    Open FilePath For Input As #1
        'テキストをすべて取得する
        Do Until EOF(1)
            Line Input #1, buf
            a = a & buf & vbLf
        Loop
    Close #1
        
    'Shift-JIS形式のファイル以外を取得した場合は終了
    For i = 1 To Len(a)
        If Asc(Mid(a, i, 1)) = -7295 Then Exit Sub
    Next
    
    'BOMを削除する
    With CreateObject("ADODB.Stream")
        .Charset = "UTF-8"
        .Open
        .WriteText a
        .Position = 0
        .Type = 1
        .Position = 3
        byteTmp = .Read
        .Close
    End With
    
    'UTF-8でテキストファイルへ出力する
    With CreateObject("ADODB.Stream")
        .Charset = "UTF-8"
        .LineSeparator = 10
        .Type = 1
        .Open
        .Write byteTmp
        .SetEOS
        .SaveToFile FilePath, 2
        .Close
    End With

End Sub

最初にShift-JIS形式でExcel VBAに読み込みます。

テキストファイルへ出力する際にUTF-8形式で出力しています。

これでShift-JIS形式のファイルをUTF-8形式のテキストファイルへ変換できます。

Shift-JIS形式のテキストファイルを用意しました。

Shift-JIS形式のテキストファイル

Shift-JIS形式のテキストファイル

このテキストファイルに対してVBAコードを実行してみます。

Shift-JIS⇒UTF-8へ変換

UTF-8形式のファイルへ変換

UTF-8形式のファイルへ変換されました。

UTF-8(BOM付き)をUTF-8へ変換

つづいてUTF-8(BOM付き)のテキストファイルををUTF-8へ変換するVBAコードをご紹介します。

'UTF-8(BOM付き)⇒UTF-8
Sub TEST3()
    
    '変換したいテキストファイルのファイルパスを作成
    Dim FilePath
    FilePath = ThisWorkbook.Path & "\TEST.txt"
    
    'UTF-8形式のテキストファイルを読み込み
    With CreateObject("ADODB.Stream")
        .Charset = "UTF-8"
        .Open
        .LoadFromFile FilePath
        a = .ReadText
        .Close
    End With
    
    'UTF-8もしくはUTF-8(BOM付き)以外を読み込んでしまった場合は終了
    For i = 1 To Len(a)
        If Mid(a, i, 1) <> Chr(63) Then
            If Asc(Mid(a, i, 1)) = 63 Then
                Exit Sub
            End If
        End If
    Next
    
    'BOMを削除する
    With CreateObject("ADODB.Stream")
        .Charset = "UTF-8"
        .Open
        .WriteText a
        .Position = 0
        .Type = 1
        .Position = 3
        byteTmp = .Read
        .Close
    End With
    
    'UTF-8でテキストファイルへ出力する
    With CreateObject("ADODB.Stream")
        .Charset = "UTF-8"
        .LineSeparator = 10
        .Type = 1
        .Open
        .Write byteTmp
        .SetEOS
        .SaveToFile FilePath, 2
        .Close
    End With

End Sub

最初にUTF-8(BOM付き)もしくはUTF-8形式を読み込むVBAコードを記載しています。

UTF-8(BOM)とUTF-8形式の読み込みは同じコードになります。

次にUTF-8形式でテキストファイルへ出力しています。

これでUTF-8(BOM付き)をUTF-8形式へ変換することができます。

ではVBAコードを実行してみます。

UTF-8(BOM付き)のテキストファイルを用意しました。

UTF-8(BOM付き)のテキストファイル

BOM付きUTF-8形式のテキストファイル

UTF-8(BOM付き)をUTF-8形式へ変換してみます。

UTF-8(BOM付き)⇒UTF-8へ変換

BOM付きUTF-8形式ファイルをUTF-8へ変換

UTF-8(BOM付き)をUTF-8形式へ変換できました。

VBAでUTF-8(BOM付き)へ変換

Shift-JISもしくはUTF-8形式のファイルをUTF-8(BOM付き)へ変換するVBAコードをご紹介します。

わざわざUTF-8(BOM付き)へ変換する場面はなかなかないので参考までに記載しておきます。

必要なければ読み飛ばしてください。

先ほど説明したShift-JISやUTF-8への変換の方が使う場面が多いかと思います。

UTF-8(BOM付き)でしか動かないアプリケーションもあるみたいのでそのアプリケーションで使用する際に使えるかと思います。

Shift-JISをUTF-8(BOM付き)へ変換

Shift-JISをUTF-8(BOM付き)へ変換するVBAコードです。

'Shift-JIS⇒UTF-8(BOM付き)
Sub TEST4()
    
    '変換したいテキストファイルのファイルパスを作成
    Dim FilePath
    FilePath = ThisWorkbook.Path & "\TEST.txt"
    
    'Shift-JIS形式のテキストファイルを読み込み
    a = ""
    Open FilePath For Input As #1
        'テキストをすべて取得する
        Do Until EOF(1)
            Line Input #1, buf
            a = a & buf & vbLf
        Loop
    Close #1
        
    'Shift-JIS以外のファイルを読み込んでしまった場合は終了
    For i = 1 To Len(a)
        If Asc(Mid(a, i, 1)) = -7295 Then Exit Sub
    Next
    
    'UTF-8(BOM付き)でテキストファイルへ出力
    With CreateObject("ADODB.Stream")
        .Charset = "UTF-8"
        .Open
        .WriteText a, 0
        .SaveToFile FilePath, 2
        .Close
    End With
    
End Sub

最初にShift-JIS形式でデータを取得しています。

次に読み込んだデータをUTF-8(BOM付き)形式でテキストファイルへ出力しています。

これでShift-JISをUTF-8(BOM付き)へ変換することができます。

VBAコードを実行してみます。

Shift-JIS形式のテキストファイルを用意しました。

Shift-JIS形式のテキストファイル

Shift-JIS形式のテキストファイル

UTF-8(BOM付き)へ変換してみます。

Shift-JIS⇒UTF-8(BOM付き)へ変換

Shift-JIS形式をBOM付きUTF-8形式へ変換

UTF-8(BOM付き)へ変換できました。

UTF-8をUTF-8(BOM付き)へ変換

UTF-8形式のテキストファイルをUTF-8(BOM付き)変換するVBAコードはこちらです。

'UTF-8⇒UTF-8(BOM付き)
Sub TEST5()
    
    '変換したいテキストファイルのファイルパスを作成
    Dim FilePath
    FilePath = ThisWorkbook.Path & "\TEST.txt"
    
    'UTF-8もしくはUTF-8(BOM付き)のテキストファイルを読み込み
    With CreateObject("ADODB.Stream")
        .Charset = "UTF-8"
        .Open
        .LoadFromFile FilePath
        a = .ReadText
        .Close
    End With
    
    'UTF-8もしくはUTF-8(BOM付き)以外を読み込んでしまった場合は終了
    For i = 1 To Len(a)
        If Mid(a, i, 1) <> Chr(63) Then
            If Asc(Mid(a, i, 1)) = 63 Then
                Exit Sub
            End If
        End If
    Next
    
    'UTF-8(BOM付き)でテキストファイルへ出力
    With CreateObject("ADODB.Stream")
        .Charset = "UTF-8"
        .Open
        .WriteText a, 0
        .SaveToFile FilePath, 2
        .Close
    End With

End Sub

最初にUTF-8形式でテキストファイルを読み込みます。

読み込んだデータをBOM付きUTF-8形式でテキストファイルへ出力します。

これでUTF-8形式をUTF-8(BOM付き)形式へ変換することができます。

VBAコードを実行してみます。

UTF-8形式ファイルです。

UTF-8形式のテキストファイル

UTF-8形式ファイル

UTF-8(BOM付き)ファイルへ変換してみます。

UTF-8⇒UTF-8(BOM付き)へ変換

UTF-8形式ファイルをBOM付きUTF-8形式へ変換

UTF-8形式ファイルをUTF-8(BOM付き)変換できました。

おわりに

この記事ではUTF-8、UTF-8(BOM付き)、Shift-JIS形式のファイルを3つの形式へ変換する方法についてご紹介しました。

今まで使っていたテキストファイルの形式をUTF-8形式のテキストファイルへ統一したい、とか文字化けしてしまったからそれを解消したいといった場合に使えます。

変換したいテキストファイルが1つとか2つの場合は紹介したVBAコードを使う必要はありません。手動で変換した方が早いです。

ですが、大量のテキストファイルの形式を変換したい場合にはExcel VBAを使って変換するスキルが必要になってきます。

手作業で変換するとかなり時間がかかってしまいますので、Excel VBAで変換です。

今回ご紹介したVBAコードが参考になるかと思います。

最後までご覧くださいましてありがとうございました。

関連する記事から探す

カテゴリから探す

カテゴリから見たい項目を探すと便利ですよ。

アーカイブから探す