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=こんにちは
使い方
- ExcelでVBAエディタを開きます(
Alt + F11
)。- 「挿入」→「モジュール」を選択し、上記コードを貼り付けます。
- VBAエディタを閉じてExcelに戻ります。
- ワークシートで次のように関数を使用します:
- 例:
=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
の形式を変換できます。この方法は外部リソースを使わないためエラーになりにくいです。
このコードの特徴
外部ライブラリ不要
- MSXML2を使わないため、環境依存の問題がなくなります。
基本的なデコード処理を手作業で実装
%XX
の形式を検出し、Chr
関数を使って対応する文字に変換します。全体をデコード
- 入力全体をデコード対象にするため、「分離せず」に処理します。
使い方
- ExcelのVBAエディタに上記のコードを追加します。
- 次のように関数を使用できます:
- 入力:
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