• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Access97のクエリ内でのStrConv関数について)

Access97のクエリ内でのStrConv関数の妙な挙動について

このQ&Aのポイント
  • Access97でクエリ内で文字の長さを判定しようとしていた際、StrConv関数の挙動に戸惑いました。奇数バイトの結果が正しくないことや、特定の結果が表示されないことがありました。
  • この問題の理由や対処方法を教えてください。
  • 環境はWindows2000ProSP4、Access97SR2です。Access2000では正しい結果が表示されることも確認しました。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

a = 1 ab = 2 abc = 3 あ = 2 あい = 4 あいう = 6 という結果をクエリでも VBA でも受け取れるようにしたい、ということですね? Access 95 以降は VBA が実装されましたが、VBA 内部では文字を Unicode で扱っています。 しかし Access 95/97 の表の部分では文字を ANSI で扱っているため、非常にやっかいです。 Access 2000 以降では全て Unicode になっています。 ------------------------------------------- ちなみに Access 97 でテキスト型フィールドのサイズをめいっぱいの255にしたとして、全角だと127文字、半角だと256文字までの制限になります。 これはこのバージョンの Access が半角文字を1byte、全角文字を2byteで管理しているからです。 Access 2000 以降は全角も半角も256文字入りますので、Unicode で格納していることがわかります。 ------------------------------------------- で、Access 97 でも 2000 以降でも使える LenBEx 関数を作ってみましたので試してみてください。 標準モジュールに下記コードを入力して、クエリの式ビルダからも関数の一覧で選択すれば使用できます。 Public Function LenBEx(var As Variant) As Variant   LenBEx = LenB(StrConv(var, vbFromUnicode)) End Function

tomo-yuki
質問者

お礼

ご回答ありがとうございます。 > Access 95 以降は VBA が実装されましたが、 > VBA 内部では文字を Unicode で扱っています。 > しかし Access 95/97 の表の部分では文字を > ANSI で扱っているため、非常にやっかいです。 VBAとテーブルでコードが異なっているというのは 恥ずかしながら初めて知りました。 不思議でもなんでもなくて、そういうものだったのですね。 勉強になりました。

その他の回答 (1)

回答No.1

原因は Unicode ですね。 Access 97 は Unicode じゃないです。 実際にどういう結果を期待しているのかがわからないので適当に書きます。適宜試してみてください。 SELECT foo.bar, LenB(StrConv(StrConv([foo].[bar],64),128)) As 式1 FROM foo; StrConv の 64 は「規定のコードページから Unicode への変換」なので、Access 97 では ANSI から Unicode へ明示的に変更した上で、さらに StrConv の 128 で Unicode から規定のコードページ ANSI に変換します。 その結果を LenB に掛けていますので、 bar | 式1 1 | 2 22 | 4 333 | 6 4444 | 8 になります。 Access 2000 以降で行っても同様の結果となります。 LenB = バイト数 なので、半角1文字 = 2byte です。 LenB を Len にすれば 式1 の結果は「見た目の文字数」となります。 ポイントとしては、まず最初に「規定のページコード」から明示的に Unicode に統一する。 ってところでしょうか。

tomo-yuki
質問者

補足

ご回答ありがとうございます。 >実際にどういう結果を期待しているのかがわからないので 半角文字は1Byte,全角文字は2Byteとして、 Byte数を取りたいのです。 ご回答いただいた > LenB(StrConv(StrConv([foo].[bar],64),128)) と、LenB([foo].[bar])の違いがわかりません。 どちらも結果は全角、半角ともに一文字に対して 2を返します。 全角、半角ともに一文字2Byteということは、その状態が Unicodeなのではないか、という理解をしていました。 なので、vbFromUnicode(128)を使用して変換をかけて からByte数を取得しようとしたわけです。 ちなみに、不思議なのはクエリでなくVBA上では私の 意図したとおり動作することです。

関連するQ&A

専門家に質問してみよう