Think Twice
IT技術メモ | VBAのメモ
Created: 2019-12-16 / Updated: 2021-03-29

VBAでURLデコード


当メモは2019-12-16に投稿されたものを加筆修正し、再掲したものです。

目次


UTF-8でパーセントエンコードされた文字列をデコードする(簡易版)

こちらはVBAでURLデコードを行う方法についてのメモです。

Excel VBAでUTF-8でパーセントエンコードされた文字列をデコードする必要があり、
ちょっと調べてみたらADODB.Streamを使うと出来そうだったのでやってみた。

環境

コード

PercentDecode
Copy
Option Explicit

'''
' UTF-8でパーセントエンコードされた文字列をデコードします
'
' @param percentEncodedStr UTF-8でパーセントエンコードされた文字列
' @return デコードした文字列
'
' ※ADODB.Streamを利用するため、ツール > 参照設定で
' 「Microsoft ActiveX Data Objects 6.1 Library」を追加してください。
'
Public Function PercentDecode(percentEncodedStr As String) As String
  ' 空文字なら空文字を返却
  If IsEmpty(percentEncodedStr) Then
    PercentDecode = ""
    Exit Function
  End If

  ' ストリームをオープン
  Dim objStm As ADODB.Stream
  Set objStm = New ADODB.Stream
  objStm.Open
  
  ' ストリームをリセット
  objStm.Position = 0
  objStm.SetEOS
  
  ' バイナリを書き込み
  objStm.Type = ADODB.adTypeBinary
  objStm.Write ToHexBytes(percentEncodedStr)
  
  ' UTF-8でテキスト読み込み
  objStm.Position = 0
  objStm.Type = ADODB.adTypeText
  objStm.Charset = "UTF-8"
  PercentDecode = objStm.ReadText() ' 結果返却
  
  ' ストリームをクローズ
  objStm.Close
  Set objStm = Nothing
End Function

'''
' UTF-8でパーセントエンコードされた文字列をバイト配列に変換します
'
' @param percentEncodedStr UTF-8でパーセントエンコードされた文字列
' @return バイト配列
'
Private Function ToHexBytes(percentEncodedStr As String) As Byte()
  Dim size As Long
  size = Len(percentEncodedStr) / 3
  
  Dim bytes() As Byte
  ReDim bytes(0 To size - 1)
  Dim i As Long
  For i = 0 To size - 1
    bytes(i) = Val("&H" & Mid(percentEncodedStr, (i * 3) + 2, 2))
  Next i

  ToHexBytes = bytes
End Function

使い方

PercentDecodeがパブリック関数になっているので、こちらをExcelの数式などとして利用するだけです。
引数はパーセントエンコードされた文字列を受け取り、戻り値はデコードした文字列となります。

デモ

注意

なお、すべての文字が3バイトにパーセントエンコードされていた場合しか想定していません。
また、例外処理なども省略しています。あくまでテスト用ということで利用する際はもうちょっとアレンジが必要です。
利用される際はご注意下さい。


参考

元記事

参考サイト