メモ型のフィールドをレコードセットでオープンして使おうとすると、256文字以降が切れる、または文字化けするという状況になり調査を開始しました。
文字切れ(文字化け)の現象再現
以下のクエリーをレコードセットで開きます。
今回はAccess内のテーブルなのでDAOを使っています。
変数strMemoにフィールド【メモ型テスト】を代入してMsgbox()で表示するのですが、strMemo変数に代入された時点で【メモ型テスト】が255文字で切られてしまうという現象です。
クエリーを表示するだけであれば256文字以上も表示できているのにレコードセットとして開いて【メモ型テスト】を取得すると255文字で切れます。
複数レコードがヒットするケースだと文字切れ+文字化けという現象になっていました。
原因はnz()関数
DAOレコードセットが悪いのか?ADOならいいのか?
テーブルから直接レコードセット取得ならいいのか?
あれこれ試した結論は、nz()関数でした。
そこか・・・。という感じです。
クエリーでフィールド関数としてnz()を使う際、表示に問題はなかったのですが、このフィールドをレコードセットとして取得すると上記のような現象になります。
nz()関数とは?
nz()関数とは取得した値がNULLなら長さ0の文字列(””)に変換して返してくれる関数です。
取得した値を別テーブルに格納する場合など、IsNull()で事前にNull値の判断しなくても代入ができるのでよく使っています。
※Null値をフィールドにそのまま代入するとエラーになります。
クエリーでnz()関数を使わずにVBAで回避する
結局、クエリーでnz()関数を使用する際、256文字以上は問題があるようなのでnz()関数を使わないように変更しました。
この変更により、メモ型テストフィールドにNULL値が入る可能性が出てきました。
このため、strMemo変数に値を代入する際にNz()関数を使いました。
strMemo = Nz(.Fields(“メモ型テスト”))
この部分はNz()関数を使用する場合は問題なく処理できるようです。(不思議・・・)
Accessには「?」という仕様が時々あるので、困ってしまいます。
困っている方の参考になれば幸いです。