今回は事務職の方にはちょっとマニアックなURLエンコードの話題です。
どちらかというとWeb担当者の方やアフィリエイターさん向けの内容になっています。
※2016/4/14追記 総務や経理でも役立つ関数実用例をご紹介いただきました!
マクロが分からない方でもサンプルファイルをダウンロードしていただければ、ただのワークシート関数としても簡単に利用できますので、ぜひご活用ください。
<古いエクセルでもURL変換できる関数のサンプルファイルはこちらです>
url_encode.xls(2016/4/14 pslaboさんの関数実用例を勝手に盛り込みました)
※この記事はExcel2010以前のバージョン向けです。
2013以降ではENCODEURLというワークシート関数が実装されていますのでそちらを使ってください。
使い方は同じです。
目次
そもそもURL変換ってなに?なんのためにするの?
通常、インターネット上のページのアドレスには半角の英数字が使われます。
というのも、実は日本語の文字列は直接ウェブサーバー上でアドレスとして認識できないんですね。
そこで、インターネット上のアドレスとして認識できるように変換する必要がでてくるわけです。
このURL変換をエクセルの関数で実現しようというのが今回のテーマです。
URL変換をワークシート関数として使用する
まずはワークシート上で関数としてURL変換してみましょう。
ダウンロードしたファイルには既に関数が入っていますが、例えば上の図のように、URLENCODE関数のカッコ内にセルA4(この場合は「占い」という日本語)を指定した結果、「%E5%8D%A0%E3%81%84」という文字列に変換されます。
URLとして使用したい日本語の文字列がたくさんあって、それを一気に変換するのであれば、このようにワークシート関数として使うのが一番楽ですね。
URL変換をマクロ(VBA)内の関数として使用する
次に、VBA関数としてURL変換を行う例をご紹介します。
まず、先ほどワークシート上でも使っていた自作のURLENCODE関数の正体は下記のとおりです。
UrlEncode関数のVBAコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
'日本語をURLエンコードする関数(ワークシート内でもマクロ内でも使えます) Function UrlEncode(mySource As Variant) As String '変数の宣言 Dim objSC As Object 'ScriptControlオブジェクトを格納するための変数 'ScriptControlオブジェクトのインスタンスを生成 Set objSC = CreateObject("ScriptControl") 'ScriptControlオブジェクトの言語をJScriptに設定 objSC.Language = "JScript" '関数の戻り値として、引数mySourceをURLエンコードした値をセット UrlEncode = objSC.CodeObject.encodeURIComponent(mySource) 'ScriptControlオブジェクトを破棄 Set objSC = Nothing End Function |
なんのことはない、実質5行のコードです。
Excel VBA単体では日本語の文字列をURL変換できる機能がありませんので、JScript(JavaScript)の機能を借りて実現していますが、このへんはあまりよくわからなくても大丈夫です。マクロ内でもやはりUrlEncode関数のカッコの中に変換元のセルや値(文字列)を入れれば変換後の文字列が返ってくる仕組みになっています。
(※上級者の方向けに付け加えますが、引数mySourceをあえてVariant型で宣言しているのは、ワークシート上で使う際にはRangeオブジェクト、VBA上で使う際にはString型の文字列をそれぞれ入れられるようにするためです。)
では、この関数を使ってマクロ内でどんなことができるかというと、例えば下記のようなことができます。
UrlEncode関数の使用例
↑上記のようなボタンを押すと、↓下記のような入力ボックスが表示され、例として「日本語」という文字列を入力しています。
OKボタンを押すと、↓下記のようなメッセージボックスに変換後の文字列が表示されます。
いかがでしょうか。イメージがわきましたか?
では、最初に押した「URL変換マクロ」ボタンを押すと実行されるマクロのコードをご説明します。
1 2 3 4 5 6 7 |
'マクロ内でURLエンコードするサンプル Sub ShowUrlEncode() 'インプットボックスに入力された値を上記のUrlEncode関数でURL変換してメッセージとして表示 MsgBox UrlEncode(InputBox("URL変換したい日本語を入力してください")) End Sub |
先ほどのUrlEncode関数を利用しているので実質たった一行です。
まずInputBox関数で変換元の日本語を入力してもらって、それをUrlEncode関数でURL変換し、メッセージボックスとして表示しています。
今回参考になったサイト
まず参考にしたのは↑こちらの知恵袋のベストアンサーですが、この例だと変換後の文字列がVBエディタのイミディエイトウィンドウに出力されるだけですので、関数として利用できていません。ちなみに、表題とはうらはらに出力結果はPunycode(ピュニコード)になっていません。そして、この事例は参照設定も必要な書き方になっています。
次に参考にしたのは↓こちらの記事です。
これはシンプルな関数になっていて、参照設定も必要ない書き方をしていただいているので、かなり参考になりました。
ただ、引数がString型なのでVBAでしか使えないようになっています。このままではワークシート上で関数として利用できませんでしたので、私は何でも格納できるVariant型で宣言しました。
pslaboさんのブログでご紹介いただきました!
私が書いたのはただの関数、しかもExcel2013以降のバージョンでは標準機能として実装済みのものなのですが、pslaboさんが見事に実用的な使い方に発展させてくれました。すごい!!
これなら総務や経理といった事務方のオフィスでもバリバリ役に立ちますね。私にはこういう発想は浮かびません。本当にありがとうございます。
詳しい解説は上記のブログを読んでみてくださいね。
ダウンロードファイル
url_encode.xls(2016/4/14 pslaboさんの関数実用例を勝手に盛り込みました)
今日のExcelスキルアップ
今回はエクセルのユーザー定義関数で日本語文字列をURL変換する方法をご紹介しました。
マクロがわからない方でもワークシート関数として利用していただければ結構ですし、上級者の方はVBAの中でも活用してみてください。
本当は「○○.jp」のような日本語ドメインをPunycode(ピュニコード)に変換する方法をエクセルで実現したくていろいろ調べていたんですが、みつかりませんでした。。。もしご存知でしたら、どなたかコメント欄やTwitterで教えてくださいm(_ _)m
ではまた。
- 投稿タグ
- JScript, ScriptControlオブジェクト, URL変換, VBA, ユーザー定義関数
コメント