メルマガの記事で自作関数を作ったけど、下記の方が簡単かも・・・
VBAからJavaScriptを使う方法を載せます。
スクリプト コントロールの概要
https://www.microsoft.com/japan/msdn/scripting/scriptcontrol/scoverview.htm
↑MSのサイトだけど、httpとhttpsが混在してると警告が出るけどビックリしないでね。
頭の例は、MSが大好きなVBScriptだけど、.Language = "JScript" も可能と途中で書いてありました・・・。
なんて↑へんな日本語で書くよりコード↓を見た方が伝わりやすいですよね。
|
概要: |
リンク 分類:
[Document(文章)からデータを取得]
/ [Form入力処理]
/ [Linkリンク情報]
/ [Image画像情報]
/ [Frameフレーム処理]
サンプル:
[IEを使ったVBAのサンプル]
/ [小さなVBAでIE操作のコード]
やっと、下記、メルマガで発行した内容です。何かの参考となれば幸いです。
過去のメルマガ[IE操作系の記事一覧]もヨロシクです。
どうも、三流プログラマーのKen3です。 今回は、 本の通信販売、amazon.comで使用している、 UTF-8のkeywordコードを作ってみたいと思います。/* * 1.今回のキッカケ */
前回、都道府県別のhtmlファイルを作成しました。 目的は、旅行の広告ページを作ることです。 そこで、旅行の申し込み広告の下にガイドブックの広告を表示して、 ガイドブックをついでに買ってもらう or 旅行の申し込み無くても興味あるターゲットに本を売ろう と考えました。 本の通信販売、有名なamazon.comでキーワードリンクがあるので、 神奈川ガイドと都道府県にガイドを付けてキーワードにしてみたいと思います。 手作業で作ると、 keyword=%E7%A5%9E%E5%A5%88%E5%B7%9D+%E3%82%AC%E3%82%A4%E3%83%89&mode=blended となり、keywordに%E7%A5%9E%E5%A5%88%E5%B7%9Dなど、コードが指定されています。 このコードが聞き慣れないUTF-8のコードです。/* * 2.UTF-8のデータ構造を調べてみた */
ASP系のメルマガとかぶってしまうのですが(流用なのですが、) http://www.ken3.org/cgi-bin/cnt/log100.asp で、リンク元などを確認してます。 リンク元をみてみると、googleからの検索で http://www.google.co.jp/search?q=%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB などのkeywordコードが保存されてます。 q=が検索文字列だと思うのですが、 %E3 %83 %95ってなんだ?どうしても変換方法が見つかりませんでした また、別のログデータからコード体系らしい部分を見ると、 ie=utf8&oe=utf8&querytime=8TuE& このUTF8ってのが怪しそうです。 何を見たか?下記のようなコードの表を見ました。 http://www.asahi-net.or.jp/~CI5M-NMR/w3/rfc2279.txt より UCS-4 range (hex.) UTF-8 octet sequence (binary) 0000 0000-0000 007F 0xxxxxxx 0000 0080-0000 07FF 110xxxxx 10xxxxxx 0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx 0001 0000-001F FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 0020 0000-03FF FFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 0400 0000-7FFF FFFF 1111110x 10xxxxxx ... 10xxxxxx と、変換表(規則)が書いてあった。 ※binaryの単語で引っかかったと思う。 これを見て、手で変換してみた。 http://www.google.co.jp/search?q=%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB が検索単語の ファイル を指定してます。 %E3%83%95 フ %E3%82%A1 ァ %E3%82%A4 イ %E3%83%AB ル とUTF-8でコード付けされてます。 ファイルの[フ]がE3 83 95かぁこれを2進数に直すと。 E 3 8 3 9 5 1110 0011 1000 0011 1001 0101 となります。 ここから、 0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx の規則でxxxxの実データを取り出すと(1110 10 10は固定のコードなので) E 3 8 3 9 5 1110 0011 1000 0011 1001 0101 xxxx xx xxxx xx xxxx から xの部分を取り出すと、 0011 00 0011 01 0101 となり、わかりやすく、 0011 0000 1101 0101 として16進に直すと 30D5となるが、これはUNICODEらしい。 これをシフトJISから変換できれば、 UTF-8のデータを作り出せそうです。 ※SJISとUTF-8のやり取りができそうです。/* * 3.UNICODEと言われてもなぁ ASCW関数で単純に変換してみた */
UNICODEと言われてもなぁ、どうやって変換するんだろう? 悩んでいたら、ASCWとCHRWがUnicode コード ポイントをやり取りするみたいです。 ASCとASCW関数 http://www.microsoft.com/japan/msdn/library/ja/vblr7/html/vafctasc.asp CHRとCHRW関数 http://www.microsoft.com/japan/msdn/library/ja/vblr7/html/vafctchr.asp に書いてありました。 ASC関数とASCW関数の違いを見るために、 下記の確認プログラムをASPのVBScriptで作ってみました。 単純にASCとASCWで変換しただけですが。 三流君ASPを変換すると、下記でテストすると、 http://www.ken3.org/cgi-bin/test/test097-1.asp?DATA=%8EO%97%AC%8CNASP n文字目 調査する文字 ASC結果(16進) ASCW結果(16進) 1 三 8E4F 4E09 2 流 97AC 6D41 3 君 8C4E 541B と変換されます。 おっと、確認したいのは、ファイルのフのユニコードだった、 http://www.ken3.org/cgi-bin/test/test097-1.asp?DATA=%83t%83@%83C%83%8B で確認すると、 n文字目 調査する文字 ASC結果(16進) ASCW結果(16進) 1 フ 8374 30D5 2 ァ 8340 30A1 3 イ 8343 30A4 4 ル 838B 30EB と表示されました。 30D5のコードにやっとたどり着きました。/* * 4.SJISをUTF-8に直す */
さてと、 では、本題の何も意識しないで使用しているシフトJISをUTF-8に直してみます。 SJISをASCW関数でUNICODEに変換してから、 そのコードを2進数に直す。 2進数を固定のビットを立てたコードに当てはめて、 再び16進数に戻す。そのとき%を付けた文字列にする。 なんか、かったるいけど、チャレンジしてみます。 ASP VBScriptで作ったサンプルは、下記のサンプルです。 儲かる http://www.ken3.org/cgi-bin/test/test097-3.asp?DATA=%96%D7%82%A9%82%E9 娘。 http://www.ken3.org/cgi-bin/test/test097-3.asp?DATA=%96%BA%81B 転職 http://www.ken3.org/cgi-bin/test/test097-3.asp?DATA=%93%5D%90E で、終わるとさびしいので、VBAのファイル作成処理に追加してみます。 ソースは長いけど、 下記のような感じです。 ポイントは、ASCWでUNICODEにして、2進数に変換後、 変換した16ビットを 'xxxx xxxx xxxx xxxx を下記に割り当てる '1110xxxx 10xxxxxx 10xxxxxx と、指定位置に割り当てただけです。
Function MAKE_AMAZON_KEYWORD(strMOTO As String) Dim n As Integer Dim strRET As String Dim strCHK As String Dim strCODE As String Dim strUNICODE As String Dim strUTF8 As String strRET = "" 'リターン値を初期化する For n = 1 To Len(strMOTO) strCHK = Mid(strMOTO, n, 1) '一文字取り出す strCODE = Hex(Asc(strCHK)) 'その文字コードを16進文字列にする If Len(strCODE) <= 2 Then '半角か? If Asc(strCHK) <= &H20 Then '制御コードか? strRET = strRET & "%" & Right("0" & strCODE, 2) Else '英数はそのまま+する strRET = strRET & strCHK End If Else '全角文字の時は、UTF-8にする strUNICODE = Hex(AscW(strCHK)) 'まずUNICODEに変換する strUTF8 = UNItoUTF8(strUNICODE) '次にUNICODEをUTF8に変換する '%を付けて格納 strRET = strRET & "%" & Mid(strUTF8, 1, 2) strRET = strRET & "%" & Mid(strUTF8, 3, 2) strRET = strRET & "%" & Mid(strUTF8, 5, 2) End If Next n 'リターン値をセットして終わる MAKE_AMAZON_KEYWORD = strRET End Function |
Function UNItoUTF8(strUNICODE As String) As String Dim strWORK As String Dim strUTF8 As String 'JISコードを2進にする strWORK = HEX16toSTR2(strUNICODE) '切り取って、UTF8の2進数を作成する 'xxxx xxxx xxxx xxxx を下記に割り当てる '1110xxxx 10xxxxxx 10xxxxxx strUTF8 = "1110" & Mid(strWORK, 1, 4) strUTF8 = strUTF8 & "10" & Mid(strWORK, 5, 6) strUTF8 = strUTF8 & "10" & Mid(strWORK, 11, 6) '作成した2進数を16進数文字列に再度戻してリターン値とする UNItoUTF8 = STR2toHEX16(strUTF8) End Function |
Function HEX16toSTR2(strHEX As String) As String Dim n As Integer 'ループカウンタ Dim i As Integer 'ループのカウンタ Dim n8421 As Integer '8 4 2 1の数値計算用 Dim str2STR As String Dim nCHK As Integer str2STR = "" '結果のエリアを初期化する '文字数分ループする For n = 1 To Len(strHEX) nCHK = CInt("&h" & Mid(strHEX, n, 1)) 'n文字目を数値変換 n8421 = 8 '初期値に8を代入する(上からチェックしたいので) For i = 1 To 4 '4回まわるよ If (nCHK And n8421) = 0 Then 'Andでビットをチェックする str2STR = str2STR & "0" 'ビットは立ってないよ Else str2STR = str2STR & "1" 'ビットは立ってるよ End If '次のビットをチェックしたいので2で割る n8421 = n8421 / 2 Next i Next n 'リターン値をセットして終了 HEX16toSTR2 = str2STR End Function |
Function STR2toHEX16(ByVal str2 As String) As String Dim strHEX As String Dim n As Integer 'ループカウンタ Dim i As Integer 'ループのカウンタ Dim n8421 As Integer '8 4 2 1の数値計算用 Dim nBYTE As Integer '頭4文字単位かチェックする n = Len(str2) Mod 4 '足りない文字数を計算する If n <> 0 Then str2 = String(4 - n, "0") & str2 '頭に文字0を追加する End If strHEX = "" '結果のエリアを初期化する '文字数分ループする For n = 1 To Len(str2) Step 4 '4文字(1バイト)単位にループを作る n8421 = 8 '初期値に8を代入する(上から計算したいので) nBYTE = 0 '1バイト計算用変数を初期化 For i = 0 To 3 '4回まわるよ(4ビット分) 'ビットが立っているかチェックする If Mid(str2, n + i, 1) = "1" Then nBYTE = nBYTE + n8421 'ビットに対応した数値を+する End If '次のビットを計算したいので2で割る n8421 = n8421 / 2 Next i '計算して、1倍との数値が完成したので16進文字にしてセットする strHEX = strHEX & Hex(nBYTE) Next n 'リターン値をセットして関数を抜ける STR2toHEX16 = strHEX End Function |
三流解説を読んでいただき、どうもです。ここから下は、三流君宛のメッセージ送信や 三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、※質問や感想は、気軽に送ってくださいね。
[三流君 VBAでWebBrowser IEを操作する] / [三流君 VBAで楽しくプログラミング] / [AB型の変わり者 三流プログラマー Ken3 三流君Top]
大分類:[Document.Forms(入力処理)]
/ [Document.Links(リンク情報)]
/ [Document.Images(画像情報)]
/ [Document.Frames(フレーム処理)] | |
F1でヘルプを見たり、デバック時にDebug.Print使ったり、イミディエイト ウインドウで簡単な確認したり。 項目別に↓にプログラマーの本音?それとも建て前?的な記事をまとめました。お探しのジャンルを選択してください。 項目別に↓に人気の記事をまとめてみました。お探しのジャンルを選択してください。 Excel関係: Access関係: その他:VBAの共通関数やテキストファイルの操作など Blog:[三流君の作業日記]/
[objIEを使用したサンプルコードを見る]/
広告-[通販人気商品の足跡] |
三流プログラマーのKen3 が 皆さんの質問にお答えします
と カッコつけて言っても、実力不足ですべての質問に回答することはできないのが現実なのですが、できる範囲で 三流的な逃げ手 や 解決方法 を探します(回答します)。
感想や質問・要望・苦情など 三流君へメッセージを送る。
時間的余裕のある要望・質問・苦情の場合は、下記のフォームからメッセージを送ることができます。