■ FS社からの 6/1 のメール
月末処理の為、[勤怠報告書]ボタンをクリックしたところ、「指定されたデータ量がフィールドサイズを超えています」と表示されました。
「OK」ボタンを押して続行しました。
表示されたデータに問題はありませんでした。
■ 考察
- 添付ファイルの画像をよく見ると、対象日を 5/1〜5/31 の一ヶ月分としたようだ。
- エラーが出たのは、モジュール「M_作業日報」の関数「makeTable勤怠日報」となっている。
- Microsoft サポート「Access でクエリを実行するとエラー メッセージ "指定されたデータ量がフィールド サイズを超えています" が表示される」には、次のように載っていた。
原因 この問題は、"固有の値" クエリ プロパティが [はい] に設定されると、作成される SQL ステートメントに DISTINCT キーワードが追加されることが原因で発生します。
DISTINCT キーワードが指定されると、Access でレコード間の比較が実行されます。Access で 2 つのメモ型フィールドの比較が実行されるときには、フィールドは最大 255 文字のテキスト型フィールドとして扱われます。
メモ型フィールドに 255 文字を超えるデータが含まれている場合、「現象」に記載されているエラー メッセージが表示されることがあります。場合によっては、メモ型フィールドから 255 文字だけが返されることがあります。- どうも、テキスト型フィールドに 255文字を超える値を代入した‥‥ と思われる。
- コードを目で追ったが、複雑すぎて原因を特定するまでに至らなかった...
■ 原因と対応策
FS社で再現出来たので、エラートラップをコメントアウト。再度、実行したら、原因が直ぐ判った。
≪原因箇所≫
Dim old非稼動事由 As String RS2!非稼動事由 = old非稼動事由
≪原因≫
- RS2!非稼動事由 はテキスト型フィールドで、サイズは 255。
- old非稼動事由 の文字数は 311 であった。
≪対応策≫
「非稼動事由」は参考情報であるので、文字数が 255 を超えていたら、次のようにすることとした。
- メッセージを出す。
- 250字で切り捨て、
- “ ???”を付けて出力する。
If Len(old非稼動事由) > 255 Then MsgBox "非稼動事由の文字数が制限を超えたので、250字に切り捨てました。" & vbCrLf & vbCrLf _ & " ■作業者コード=" & old作業者コード & vbCrLf _ & " ■文字数=" & Len(old非稼動事由) & vbCrLf _ & " ■非稼動事由=" & old非稼動事由 & vbCrLf _ , vbExclamation, mbTitle old非稼動事由 = Left(old非稼動事由, 250) & " ???" End If RS2!非稼動事由 = old非稼動事由