URL に含まれる日本語や記号はパーセント記法(%E3%81%AAど)へ変換されています。Excel VBA では JScript と PowerShell を利用して簡単に元の文字列(デコード)へ戻せます。本記事では両手法のコード例とポイントをまとめます。
目次
動作環境
項目 | 内容 |
---|---|
OS | Windows 10/11 |
Excel | Microsoft 365/2019/2016 |
追加ツール | なし(標準機能のみ) |
方法 1:ScriptControl(JScript)の decodeURI
を呼び出す
ScriptControl
を使うと、VBA から JavaScript 関数を呼び出せます。参照設定は不要で、32 ビット/64 ビットの両環境で動作します。
Sub DecodeUrlWithJScript()
Dim encodedText As String
Dim sc As Object ' MSScriptControl.ScriptControl
encodedText = "E6%A3%AE%20Rintaro"
Set sc = CreateObject("ScriptControl")
sc.Language = "JScript"
' decodeURI でデコード
encodedText = sc.CodeObject.decodeURI(encodedText)
MsgBox encodedText, vbInformation, "デコード結果"
End Sub
ポイント
Language = "JScript"
で JavaScript 実行環境を設定します。decodeURI
はエンコードされた文字列を UTF-8 として解釈し、元の日本語へ戻します。- ScriptControl は Windows 標準の COM コンポーネントで、追加インストールは不要です。
方法 2:PowerShell の System.Web.HttpUtility.UrlDecode
を呼び出す
PowerShell 経由で .NET Framework の URL デコード関数を利用する方法です。非同期で実行し、標準出力を VBA 側で受け取ります。
Sub DecodeUrlWithPowerShell()
Dim encodedText As String
Dim psCmd As String
Dim wsh As Object ' WScript.Shell
Dim execObj As Object ' WshScriptExec
encodedText = "E6%A3%AE%20Rintaro"
' PowerShell コマンド組み立て
psCmd = "powershell -NoProfile -Command " & _
"""Add-Type -AssemblyName System.Web;" & _
"Write-Output ([System.Web.HttpUtility]::UrlDecode('" & encodedText & "'))"""
Set wsh = CreateObject("WScript.Shell")
Set execObj = wsh.Exec(psCmd)
MsgBox execObj.StdOut.ReadAll, vbInformation, "デコード結果"
End Sub
ポイント
-NoProfile
で PowerShell のプロファイル読み込みを省き、実行を高速化します。Add-Type
により System.Web アセンブリを読み込み、UrlDecode
メソッドを利用します。Exec
メソッドは非同期実行ですが、StdOut.ReadAll
で完了を待ちながら結果を取得できます。
使い分けの目安
シナリオ | 推奨手法 |
---|---|
Excel だけで完結させたい | ScriptControl |
大量デコードをバッチ処理したい | PowerShell |
エンコードとデコードを両方行う | いずれも可(encodeURI /UrlEncode を併用) |
まとめ
- ScriptControl は軽量で実装が簡単。
- PowerShell は .NET の豊富なライブラリを活用でき、複雑な処理にも柔軟。
いずれの方法も追加ライブラリなしで利用できますので、用途に応じて使い分けてください。URL デコードを自動化することで、外部 API や Web フォームとの連携がよりスムーズになります。