Access97でクエリ内で文字の長さを判定しようとして
いたのですが、Strconv関数の妙な挙動に戸惑っています。
barというテキスト型のフィールドをもつfooという
テーブルを定義して、"1","22","333","4444"という
4つのレコードを作成します。
そして下記のようなクエリを作成し実行します。
SELECT foo.bar, LenB(StrConv([foo].[bar],128)) AS 式1, StrConv(StrConv([foo].[bar],128),64) AS 式2
FROM foo;
すると、結果は下記のようになってしまいます。
bar |式1|式2
------------
1 | 0|
22 | 2|22
333 | 2|?
4444| 4|?
式1は奇数Byteの結果が、式2は"22"以外の結果が
正しくありません。
このようになってしまう理由と、対処方法を教えて
ください。
環境は 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
ご回答ありがとうございます。
> Access 95 以降は VBA が実装されましたが、
> VBA 内部では文字を Unicode で扱っています。
> しかし Access 95/97 の表の部分では文字を
> ANSI で扱っているため、非常にやっかいです。
VBAとテーブルでコードが異なっているというのは
恥ずかしながら初めて知りました。
不思議でもなんでもなくて、そういうものだったのですね。
勉強になりました。
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 に統一する。
ってところでしょうか。
この回答への補足
ご回答ありがとうございます。
>実際にどういう結果を期待しているのかがわからないので
半角文字は1Byte,全角文字は2Byteとして、
Byte数を取りたいのです。
ご回答いただいた
> LenB(StrConv(StrConv([foo].[bar],64),128))
と、LenB([foo].[bar])の違いがわかりません。
どちらも結果は全角、半角ともに一文字に対して
2を返します。
全角、半角ともに一文字2Byteということは、その状態が
Unicodeなのではないか、という理解をしていました。
なので、vbFromUnicode(128)を使用して変換をかけて
からByte数を取得しようとしたわけです。
ちなみに、不思議なのはクエリでなくVBA上では私の
意図したとおり動作することです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# Makefileのechoの展開について 2 2022/07/26 07:35
- その他(プログラミング・Web制作) zshの例外処理 1 2022/06/02 16:36
- その他(データベース) 更新クエリをリンクデータベーステーブルに実行し実行時エラー3362固有インデックスに重複する値が含ま 1 2022/09/21 11:44
- Access(アクセス) Accessのクエリの結果を、既存のエクセルに追加したい 2 2022/07/31 22:44
- Access(アクセス) Accessテーブルの結合で別々のテーブルのフィールドを組み合わせて値を出す方法について 2 2022/07/20 19:43
- Excel(エクセル) EXCELの外部データ取得ができない 1 2023/03/23 09:03
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- Access(アクセス) access,vbaでフォルダ内のファイルをテーブルにインポート、ファイル名もフィールドに追加したい 1 2022/08/31 11:11
- Visual Basic(VBA) 以前シートを集めて1シートへ繋げる下記コードをご教授いただき作成しました。 今回すでに集めてある「ま 1 2022/08/29 20:38
- Access(アクセス) Access DAOのExecuteメソッドのオプション(RecordsetOptionEnum)に 1 2022/09/19 07:34
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
10分で500~600文字っ...
-
パワーポイントで文字の上に線...
-
1文字って1バイトだったっけ?
-
濁点(゙) 半濁点(゚)を一文字と数...
-
Accessで名前の間のスペースを...
-
terapad 1行文字数変更が反映...
-
ISO-2022-JP 変換
-
エクセルの文字制限からの文字...
-
アルファベット文字を正立させ...
-
VBAのfor...next構文で i = A ...
-
turbolinux
-
ファイル名の文字数について
-
文字数って,文字数カウント機...
-
ExcelVBAでの空白セルの判断方法
-
auのメールアドレス
-
携帯の絵文字と顔文字のパケダ...
-
i'work Pagesでの文字スタイル...
-
50KBは何文字に相当するのでし...
-
PS4コントローラーをPCでゲーム...
-
wordの何も書かれていない2ペー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
1文字って1バイトだったっけ?
-
パワーポイントで文字の上に線...
-
10分で500~600文字っ...
-
エクセルのIF文で「NOT=...
-
濁点(゙) 半濁点(゚)を一文字と数...
-
VBAのfor...next構文で i = A ...
-
エクセルの文字制限からの文字...
-
この、意味を、知りたいです
-
50KBは何文字に相当するのでし...
-
コンピューター名の文字数制限
-
Accessで名前の間のスペースを...
-
VLOOKUP関数で検索できません
-
2バイトって何文字分ですか?
-
http://oshiete.goo.ne.jp/qa/1...
-
どっちが正しいですか? チョン...
-
auのメールアドレス
-
全角は日本独自のものか
-
Excelで入力禁止文字を設定したい
-
128ビットのパスワード
-
Excelで入力文字の優先表示を行...
おすすめ情報