スイカ大好き

インフラ⇒Web⇒バックエンド ふら~ふら~とモラトリアムし続けてる文系エンジニアの、日々の技術メモ

VBA エンコードされた日本語をデコードする

Excelに関数はないようで。UTF-8とShift-JISの変換の問題。以下ABのうち、AのためのVBAコードを下方に記載します。(chatGPTがコーディングしてくれました)

  • A) UTF-8でエンコードされた文字列をShift-JISでデコード
    • この場合、UTF-8でエンコードされたバイト列をShift-JISでデコードしようとすると、Shift-JISはUTF-8のバイト列を正しく解釈できません。UTF-8のバイト列は、Shift-JISの2バイトシーケンスとは異なり、Shift-JISが予期するバイト値とは異なるため、文字が正しくデコードされず、代わりに無効な文字や「%」のような誤った文字列が表示されます。
  • B) Shift-JISでエンコードされた文字列をUTF-8でデコード
    • この場合でも文字化けは起こる可能性がありますが、通常、文字列が「%」やその他の記号になることは少なく、文字列の中に不正なバイトが含まれた場合、無効な文字(例えば「□」など)として表示されることが多いです。

VBAコードその1

chatGPTによる説明:

  • 入力全体をデコード対象

    • 入力文字列(例: A000=%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF)をそのままデコードします。= の前後を分ける操作はありません。
  • MSXML2を利用

    • URLデコードを簡単に実現するため、MSXML2ライブラリを使用しています。
  • 結果

    • 入力例: A000=%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF
    • 出力例: A000=こんにちは

使い方

  1. ExcelでVBAエディタを開きます(Alt + F11)。
  2. 「挿入」→「モジュール」を選択し、上記コードを貼り付けます。
  3. VBAエディタを閉じてExcelに戻ります。
  4. ワークシートで次のように関数を使用します:
    • 例: =URLDecode(A1)
      A1に A000=%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF があれば、A000=こんにちは が返されます。

Function URLDecode(ByVal EncodedText As String) As String
    Dim XMLHTTP As Object
    Dim DecodedText As String

    ' MSXML2 を使ってデコード処理
    Set XMLHTTP = CreateObject("MSXML2.XMLHTTP")
    XMLHTTP.Open "GET", "http://example.com/?" & EncodedText, False
    XMLHTTP.Send
    DecodedText = XMLHTTP.responseText

    ' デコードされた文字列を返す
    URLDecode = DecodedText
    Set XMLHTTP = Nothing
End Function

こちらは、会社の端末ではXMLHTTP.Sendの箇所でエラーになっちゃいました。

VBAコードその2

chatGPTによる説明:

XMLHTTP.Send がエラーになる場合、MSXML2を使ったデコード方法が環境に合っていない可能性があります。そのため、別の方法でデコードを実現するコードを示します。

VBAでURLデコードを行う別の方法(Replaceを使用)

VBAにはネイティブでURLデコードを行う関数はありませんが、Replace を使って %XX の形式を変換できます。この方法は外部リソースを使わないためエラーになりにくいです。

 

このコードの特徴

  1. 外部ライブラリ不要

    • MSXML2を使わないため、環境依存の問題がなくなります。
  2. 基本的なデコード処理を手作業で実装

    • %XX の形式を検出し、Chr 関数を使って対応する文字に変換します。
  3. 全体をデコード

    • 入力全体をデコード対象にするため、「分離せず」に処理します。

使い方

  1. ExcelのVBAエディタに上記のコードを追加します。
  2. 次のように関数を使用できます:
    • 入力: A000=%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF
    • 関数: =URLDecode(A1)
    • 出力: A000=こんにちは

注意点

  • %XX のエンコード部分のみが対象です。非エンコード部分はそのまま残ります。
  • Unicode対応が必要な場合も問題なく動作します。

 

Function URLDecode(ByVal EncodedText As String) As String
    Dim i As Long
    Dim CharCode As Integer
    Dim DecodedText As String
    
    i = 1
    Do While i <= Len(EncodedText)
        If Mid(EncodedText, i, 1) = "%" And i + 2 <= Len(EncodedText) Then
            ' %XX をデコード
            CharCode = Val("&H" & Mid(EncodedText, i + 1, 2))
            DecodedText = DecodedText & Chr(CharCode)
            i = i + 3 ' 次の文字へ進む
        Else
            ' 通常文字をそのまま追加
            DecodedText = DecodedText & Mid(EncodedText, i, 1)
            i = i + 1
        End If
    Loop
    
    URLDecode = DecodedText
End Function