海を飛んで君の許へ。

開発になりたかったQAが書き散らかす

VBAでUTF-8のTSVファイルの内容置換したくない?

前書き

VBAを使って、文字コードUTF-8のTSVファイルの、特定の文字列を変換したいなと思いました。

結論

[Excel VBA] 外部テキストの文字列を一斉置換する関数。(UTF-8 アンド 通常版対応版) | mixiユーザー(id:23976709)の日記
こちらのコードをほぼそのまま使えばいけます。
(書き込みの時に"Mode = 2"だと出来なかったので、"Mode = 3"に変えるだけです)


以下は長い補足

ファイルを開いて処理するにあたり、色々な問題が発生すると思います。

UTF-8Excelで開くと文字化けする問題

通常、Excelで開く場合は以下のようにWorkbooksに対してOpenメソッドを使います。

Workbooks("xxx.xlsx").Open

この方法でファイルを開く場合、文字コードがSHIFT-JISになるので、UTF-8で作成されたファイルは文字化けしてしまいます。

対策として、"adodb"というライブラリの参照設定を行い、オブジェクトを作成して利用することでUTF-8でファイルを読み書きできます。
ADO(ActiveX Data Objects)の使い方の要点|VBA技術解説
こちらのサイトに詳しい手順などが記載されています。
※このサイトでいう「事前バインディング」をしなくても使えるようですが、私の環境では上手くいかなかったので、VBAにてライブラリの参照設定を行いました。

ファイルのフルパスを取得できない問題

adodbでファイルを開くには当然フルパスが必要なので、ファイル選択ダイアログを出してあげると優しいです。

変数名 = Application.GetOpenFilename("TSVファイル,*.tsv")


こういった問題を乗り越えて完成させたのが以下のコードです。

Sub UTF-8のTSVファイル内の置換プログラム()
    Dim s As String
    Dim fileName As String
    Dim adoSt As New ADODB.Stream
    
    'ファイルの場所を確認する
    MsgBox "TSVファイルを指定してください"
    fileName = Application.GetOpenFilename("TSVファイル,*.tsv")
    If fileName = "False" Then
        MsgBox "ファイルが未指定のため処理を終了します。"
        Exit Sub
    End If
    
    'ファイルを開いて読み込む
    With adoSt
        .Mode = 3
        .Charset = "UTF-8"
        .Open
        .LoadFromFile (fileName)
        s = .ReadText
        .Close
    End With
    
    '置換する
    s = Replace(s, "置換前の文字列", "置換後の文字列")
    
    'ファイルを開いて書き込む
    With adoSt
        .Mode = 3
        .Charset = "UTF-8"
        .Open
        .WriteText s
        .SaveToFile (fileName), 2 '1は新規ファイル作成、2は指定したファイルがあれば上書き
        .Close
    End With
    
    '終了する
    MsgBox "Process finished."
End Sub

あとがき

これなぜTSVファイルなの??というところですが、手元にあったTSVファイルだと、"ReadText"した時になぜか1行しか存在してないんですよね…Excelやメモ帳で見ると複数行あっても…
同じくCSVファイルは複数行に分かれて取得できていたのですが。。
なのでほかのファイルに応用する時は、ReadTextやReplaceの時にDo Loopで回さないといけないかもしれないです。ご注意ください。