EXCELにDECODEURL関数を作る

EXCELでURLの解析をしたくなった。

EXCELにはENCODEURLという関数があって、エンコードはこれで簡単に出来ることが分かったのだが、デコード用の関数は無いようだった。(何故無いんですか、MSさん。。。)

調べると、下記の様なScriptControlを使ったコードが出てきた。

'https://www.relief.jp/docs/003799.html
Public Function URL_Decode(ByVal strOrg As String) As String
 With CreateObject("ScriptControl")
  .Language = "JScript"
  URL_Decode = .CodeObject.decodeURI(strOrg)
 End With
End Function

大体、このコードが出てくるんだけど、「msscript.ocx」は、64ビット版のEXCELだと使えないみたい。(使用バージョン: Microsoft Office Professional Plus 2021)

頑張って、64bitで動くmsscript.ocxを作るとか、テキスト受け渡しに絞るなら「htmlfile」でdecodeURIComponentを実行という方法もあるけど、Scripting.Dictionaryから、汎用的にJScriptのコードを実行出来そうな関数を作ってる人がいたので利用させてもらうことにした。

公開されてた、JSFuncでdecodeURIComponentを実行する形でDECODEDURLを実装。

これで、EXCELのENCODEURLで変換したコードが正しく逆変換されたので、問題なさげ。

Option Explicit
'https://qiita.com/nukie_53/items/297e524bcc8e43f9b5d1
Function JSFunc( _
        args As String, _
        funcBody As String, _
        Optional autoReturn As Boolean = True) As Object

    Const EXEC_SCRIPT = _
            "this.createFunc=" & _
                "function(args,funcBody){" & _
                    "return new Function(args,funcBody);}"
    '各種初期化
    '関数オブジェクトのキャッシュ
    Static funcCache As Object 'As Scripting.Dictionary
    If funcCache Is Nothing Then Set funcCache = VBA.CreateObject("Scripting.Dictionary")

    'JScript実行環境。参照を保持しないとインスタンスしたfunctionオブジェクトも消える
    Static htmlDoc    As Object 'As MSHTML.HTMLDocument
    Static createFunc As Object 'JScript function

    If htmlDoc Is Nothing Then
        Call funcCache.RemoveAll
        Set htmlDoc = VBA.CreateObject("htmlfile")

        'JScriptのグローバル変数に関数を定義
        Call htmlDoc.parentWindow.execScript(EXEC_SCRIPT)

        '作成した関数を静的変数に保管(書き換え防止)
        Set createFunc = htmlDoc.parentWindow.createFunc
    End If


    'キャッシュ用に整形
    Dim trimedArgs As String, trimedBody As String
    trimedArgs = VBA.Trim$(args)
    If autoReturn Then
        trimedBody = "return " & VBA.Trim$(funcBody)
    Else
        trimedBody = VBA.Trim$(funcBody)
    End If

    Dim cacheKey As String
    cacheKey = trimedArgs & "|" & trimedBody


    'キャッシュに無ければ新規インスタンス
    If Not funcCache.Exists(cacheKey) Then
        Call funcCache.Add(cacheKey, createFunc(trimedArgs, trimedBody))
    End If

    Set JSFunc = funcCache.Item(cacheKey)
End Function

'https://memo-nikki.info/?p=3946
Function DECODEDURL(s As String)
    Dim funcdec
    Set funcdec = JSFunc("s", "decodeURIComponent(s)")
    DECODEDURL = funcdec(s)
End Function

使い方は、「EXCEL ユーザー定義関数」でググっても出てきますし、下記の様な本だとchapter8にユーザー定義関数が書いてます。。

まあ、作った関数としては悪くないんですが、Microsoftがデフォルトで実装しておいて欲しい内容ではありますね。。。

コメント

PAGE TOP
Ads Block Detector Powered by codehelppro.com
Ads Blocker Detected!!!

We have detected that you are using extensions to block ads. Please support us by disabling these ads blocker.

タイトルとURLをコピーしました