VBA(ファイルの文字コード変換)


https://vbabeginner.net/convert-shift-jis-files-to-utf-8-without-bom/
https://vbabeginner.net/convert-utf-8-files-to-shift-jis/


-- 1. 開発タブの挿入でボタンを作成
ActiveXコントロールのものを使用する

-- 2. デザインモードONで作成したボタンをダブルクリックするとエディタが開くので下記コードを記載。デザインモードOFFで実行


※ 下記設定必要
Microsoft ActiveX Data Objects x.x Library」の参照設定

 

Option Explicit

Private Sub CommandButton1_Click()

    '画面を更新しない
    Application.ScreenUpdating = False
    '確認メッセージを表示しない
    Application.DisplayAlerts = False
    
        
    'テストファイル作成
    
    Open ThisWorkbook.Path & "\test1.txt" For Output As #1
    
        Print #1, "テストファイルです"
    
    Close #1
    
    
    'SJIS -> UTF8 変換
    Call SjisToUtf8NoBOM(ThisWorkbook.Path & "\test1.txt", ThisWorkbook.Path & "\test2.txt")
    
    
    'UTF8 -> SJIS 変換
    Call Utf8ToSjis(ThisWorkbook.Path & "\test2.txt", ThisWorkbook.Path & "\test3.txt")
    
    
    
        
    '確認メッセージを表示する
    Application.DisplayAlerts = True
    '画面を更新する
    Application.ScreenUpdating = True
    
    MsgBox ("処理完了")

End Sub


Sub SjisToUtf8NoBOM(a_sFrom, a_sTo)
    Dim streamRead  As New ADODB.Stream '// 読み込みデータ
    Dim streamWrite As New ADODB.Stream '// 書き込みデータ
    Dim sText       As Variant          '// ファイルデータ
    
    '// ファイル読み込み
    streamRead.Type = adTypeText
    streamRead.Charset = "Shift-JIS"
    streamRead.Open
    Call streamRead.LoadFromFile(a_sFrom)
    
    '// 改行コードCRLFをLFに変換
    sText = streamRead.ReadText
    sText = Replace(sText, vbCrLf, vbLf)
    
    '// ファイル書き込み
    streamWrite.Type = adTypeText
    streamWrite.Charset = "UTF-8"
    streamWrite.Open
    
    '// Shift-JISファイルのデータをUTF-8ファイルにコピー
    Call streamWrite.WriteText(sText)
    
    '// バイナリモードで書き込み済みデータ開始位置をBOM分の3バイトずらす
    streamWrite.Position = 0
    streamWrite.Type = adTypeBinary
    streamWrite.Position = 3
    
    '// 3バイトずらした状態でのデータを取得
    sText = streamWrite.Read
    
    '// ずらした開始位置を元に戻す
    streamWrite.Position = 0
    
    '// BOMが除去されたデータを先頭から書き込み直す
    Call streamWrite.Write(sText)
    
    '// 現時点の末尾を終端とし、直前に書き込まれていた3バイトをデータ対象外とする
    streamWrite.SetEOS
    
    '// 保存
    Call streamWrite.SaveToFile(a_sTo, adSaveCreateOverWrite)
    
    '// クローズ
    streamRead.Close
    streamWrite.Close
End Sub


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