MS Access Tips/Sample and VBA and Blog customize etc...

クエリで大文字/小文字、全角/半角を区別して文字列比較をしたい

クエリの抽出条件や、演算フィールドの式で文字列比較をするとき、テキストモードで比較するので、大文字/小文字、全角/半角、ひらがな/カタカナを区別しません。

「ACCESS」と「Access」と「ACCESS」を等しいとみなします。また、「アクセス」と「あくせす」も等しいとみなします。

しかし、これらを別と判断してほしい場合もあるでしょう。その場合の対処法を検討してみます。

クエリで大文字/小文字、全角/半角を区別して文字列比較

難易度:

完全一致

完全に一致するかどうかを比較するときは、StrComp関数が使えます。

StrComp 関数

第3引数(compare)で、文字列比較のモードを指定できます。

StrComp([フィールド1], "Access", 0)

というように 0(vb定数では vbBinaryCompare)を指定すればバイナリモードの比較になり、小文字、全角/半角、ひらがな/カタカナを区別して比較します。完全一致した場合のみ 0 を返します。

クエリの抽出条件にする場合は、下図のように設定します。

StrComp関数での完全一致抽出のクエリ

SQLでは、

部分一致

Like演算子で、抽出条件欄に

Like "*Access*"

というように指定すると、"ACCESS"や"ACCESS"を含むデータも抽出されます。

ここで"Access"のみ抽出したい場合、InStr関数を使います。

InStr 関数

第4引数で文字列比較モードを設定します。

InStr(1, [フィールド1], "Access", 0)

やはり、0 を指定するとバイナリモードの比較になります。フィールド1 に"Access"が含まれるときは 1以上の数が返ります。含まれないときは 0 が返ります。

クエリの抽出条件での設定例

InStr関数での部分一致抽出のクエリ

SQLでは、

前方一致

Like演算子なら、抽出条件欄に

Like "Access*"

と設定する条件です。先頭部分が一致するデータを抽出します。

上記の部分一致の式の >0 を =1 に変更するだけです。

SQLでは、

後方一致

Like演算子なら、抽出条件欄に

Like "*Access"

と設定する条件です。後方部分が一致するデータを抽出します。

フィールド StrComp(Right([フィールド1],Len("Access")),"Access",0)
抽出条件  0

SQLでは、

Like演算子代替ユーザー定義関数

関数を組み合わせて記述するのが面倒だ、あるいは、部分一致、前方一致、後方一致だけでなくLike演算子で可能なもう少し複雑な文字列比較をバイナリモードで行いたい、という場合もあるでしょう。

そうなるとユーザー定義関数を作成することになります。VBAの場合は、モジュール単位で文字列の比較モードを宣言することができます。 これを使うと簡単な関数でできます。

まず、標準モジュールを新規作成します。名前は、mdlBinaryCompare とします。下記のコードをコピーして貼り付けます。

部分一致なら下記のように記述できます。

ワイルドカード文字は * だけでなく?(任意の 1 文字)や #(1~9の数字) も使えますし、[]で囲んだ文字のリストも使用できます。Like演算子とまったく同じように使えます。

例えば、

とすれば、AZ1234 は抽出されますが、az1234 や AZ123a は抽出されません。

このモジュールの先頭で Option Compare Binary と宣言してますので、このモジュール内の関数での演算子によるテキスト比較はすべてバイナリモードになります。

バイナリモードで比較したい処理がある場合は、このモジュールに放り込んでおけばいいでしょう。

拍手する

Leave a reply






Trackbacks

trackback URL
http://hatenachips.blog34.fc2.com/tb.php/399-69af313d
該当の記事は見つかりませんでした。