VBA(UTF8ファイルのBase64エンコード)

https://www.ka-net.org/blog/?p=4479
https://vbabeginner.net/convert-shift-jis-files-to-utf-8-without-bom/


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

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

Option Explicit

Private Sub CommandButton1_Click()
    
    '画面を更新しない
    Application.ScreenUpdating = False
    '確認メッセージを表示しない
    Application.DisplayAlerts = False


    
    '(1)テストファイル作成
    
    Open ThisWorkbook.Path & "\test1.txt" For Output As #1
    
        Print #1, "テストファイルです1"
        Print #1, "テストファイルです2"
        
    Close #1
    
    
    '(2)SJIS -> UTF8
    Call SjisToUtf8NoBOM(ThisWorkbook.Path & "\test1.txt", ThisWorkbook.Path & "\test2.txt")
    
    '(3)Base64エンコード
    
    Dim buf As String
    buf = EncodeBase64(ThisWorkbook.Path & "\test2.txt")
    
    Debug.Print buf
    
    Open ThisWorkbook.Path & "\buf.txt" For Output As #1
        Print #1, buf
    Close #1
    
    
    '(4) Base64デコード
    DecodeBase64 buf, ThisWorkbook.Path & "\test3.txt"
    
    '(5)UTF8 -> SJIS
    Call Utf8ToSjis(ThisWorkbook.Path & "\test3.txt", ThisWorkbook.Path & "\test4.txt")


    '確認メッセージを表示する
    Application.DisplayAlerts = True
    '画面を更新する
    Application.ScreenUpdating = True


End Sub


'ファイルをBase64エンコード
Function EncodeBase64(ByVal FilePath As String) As String
    Const adTypeBinary = 1
    Const adReadAll = -1
    
    Dim elm As Object
    Set elm = CreateObject("MSXML2.DOMDocument").createElement("base64")
    
    Dim Base64Str As String

    With CreateObject("ADODB.Stream")
        .Type = adTypeBinary
        .Open
        .LoadFromFile FilePath
        elm.DataType = "bin.base64"
        elm.nodeTypedValue = .Read(adReadAll)
        Base64Str = elm.text
    End With

    EncodeBase64 = Replace(Base64Str, vbLf, "")
    
End Function


'ファイルをBase64デコード
Sub DecodeBase64(ByVal Base64Str As String, ByVal FilePath As String)
    Const adTypeBinary = 1
    Const adSaveCreateOverWrite = 2
        
    Dim elm As Object
    Set elm = CreateObject("MSXML2.DOMDocument").createElement("base64")
    elm.DataType = "bin.base64"
    elm.text = Base64Str
    
    With CreateObject("ADODB.Stream")
        .Type = adTypeBinary
        .Open
        .Write elm.nodeTypedValue
        .SaveToFile FilePath, adSaveCreateOverWrite
    End With

End Sub

 

'SJIS -> UTF8
Sub SjisToUtf8NoBOM(ByVal a_sFrom As String, ByVal a_sTo As String)

    Dim sText       As Variant          '// ファイルデータ
    
    Dim streamRead As Object  '// 読み込みデータ
    Dim streamWrite As Object '// 書き込みデータ
    Set streamRead = CreateObject("ADODB.Stream")
    Set streamWrite = CreateObject("ADODB.Stream")
    
    '// ファイル読み込み
    With streamRead

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


End Sub


'UTF8 -> SJIS
Sub Utf8ToSjis(ByVal a_sFrom As String, ByVal a_sTo As String)

    Dim sText       As Variant          '// ファイルデータ
    
    Dim streamRead As Object  '// 読み込みデータ
    Dim streamWrite As Object '// 書き込みデータ
    Set streamRead = CreateObject("ADODB.Stream")
    Set streamWrite = CreateObject("ADODB.Stream")
    
    '// ファイル読み込み
    With streamRead

        .Type = 2  'adTypeText
        .Charset = "UTF-8"
        .Open
        
        .LoadFromFile a_sFrom
        
        
        sText = .ReadText
        ''// 改行コードLFをCRLFに変換
        ''    sText = Replace(sText, vbLf, vbCrLf)
        ''    sText = Replace(sText, vbCr & vbCr, vbCr)
        
    End With
    
    
    '// ファイル書き込み
    With streamWrite
        .Type = 2  'adTypeText
        .Charset = "Shift-JIS"
        .Open
        
        '// データ書き込み
        .WriteText sText
        
        '// 保存
        .SaveToFile a_sTo, 2 'adSaveCreateOverWrite
    End With

End Sub