前述した「住所をUTF8に変換する処理」には、ユーザー定義関数の作成が必要となる。作成は、VBEメニューの「挿入」→「プロシージャ」から行える(図6)。
「プロシージャの追加」設定画面では、名前欄へ「encodeUTF8」と入力し、種類には「Functionプロシージャ」を、適用範囲には「Privateプロシージャ」を選択する。「OK」ボタンを押すと、VBEに、
Private Function encodeUTF8()
End Function
のコードが生成される、これをリスト3のコードに書き換える。
Private Function encodeUTF8(mytext As string)as String Dim myStream As New ADODB.Stream Dim myBinary As Variant Dim myNumber As Variant With myStream .Open .Type = adTypeText .Charset = "UTF-8" .WriteText myText .Position = 0 .Type = adTypeBinary .Position = 3 myBinary = .Read .Close End With For Each myNumber In myBinary encodeUTF8 = encodeUTF8 & "%" & Hex(myNumber) Next End Function
なお、このコードの実行には、VBEメニューの「参照設定」で「Microsoft ActiveX Data Objects 6.1 Library」を参照しておく必要がある(図6)。
リスト3のコードは、以下のように記述してある。
引数には文字列型のmyTextを用意しておく。このmyTextには、病院名リストボックスから選択された「病院名」に該当する「住所」が渡される。
ADODB.Stream型の変数myStream、バリアント型の変数myBinaryと、同じくバリアント型の変数myNumberを宣言する。
Openメソッドで引数として渡された「住所」を開き、Typeプロパティにデータの種類を「文字列型」に指定する。
Charsetプロパティに「文字コード=UTF-8」を指定する。WriteTextメソッドで、文字列の「住所」をStreamに入力する。
Positionプロパティで、Stream内の現在の位置を制御する。Positionプロパティの詳細については、下記のURLを参照してほしい。
(参考リンク)Microsoft Developer Nerwork「Position プロパティ」
Positionの値に「0」を指定した理由は、バイナリモードにするためには、Positionを1度「0」に戻す必要があるためだ。
Typeプロパティでデータ型にバイナリを指定する。再度Positionプロパティで、Streamの位置を制御する。ここでPositionの値に「3」を指定している。Positionに「3」を指定して読み込むことで、最初の「3バイト」をスキップする。ADODB.StreamオブジェクトでUTF-8形式のファイルを作成すると、ファイルの先頭に「BOM(Byte Order Mark)が付加されてしまう。つまり、「BOM」をスキップするための処理となる。
Readメソッドで、変換後の「住所」を読み込み、変数myBinaryに格納する。CloseメソッドでStreamを閉じる。
バイナリ型の「住所」を、Hex関数で文字列「%」と連結して、16進表記の文字列に変換する。「%xx」の書式に変換される。
完成したフォームを実行すると、図7のように動作する。
「Access VBAで学ぶ初心者のためのデータベース/SQL超入門」は今回で最終回だ。この連載が皆さまの職場での作業効率化のお役に立ったならば筆者冥利に尽きるのだが、いかがだっただろうか。長い間、お付き合いありがとうございました。
薬師寺国安事務所代表。Visual Basicプログラミングと、マイクロソフト系の技術をテーマとした、書籍や記事の執筆を行う。
1950年生まれ。事務系のサラリーマンだった40歳から趣味でプログラミングを始め、1996年より独学でActiveXに取り組む。
1997年に薬師寺聖とコラボレーション・ユニット「PROJECT KySS」を結成。
2003年よりフリーになり、PROJECT KySSの活動に本格的に参加。.NETやRIAに関する書籍や記事を多数執筆する傍ら、受託案件のプログラミングも手掛ける。
Windows Phoneアプリ開発を経て、現在はWindowsストアアプリを多数公開中。
Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)
Microsoft MVP for Development Platforms - Windows Phone Development(Oct 2012-Sep 2013)
Microsoft MVP for Development Platforms - Client Development(Oct 2013-Sep 2014)
Microsoft MVP for Development Platforms-Windows Platform Development (Oct 2014-Sep 2015)
Copyright © ITmedia, Inc. All Rights Reserved.