Accessのクエリがオーバーフローしたので対処した


Microsoft Access で作った業務アプリケーションが、
実行時エラー '6': オーバーフロー
と表示され処理が止まるというので調べてみた。

オーバーフローがVBAコード中の代入文で停止している場合は、対処は難しくない。
数値はデータ型ごとに扱える値の範囲が決まっていて、その範囲を超えて代入しようとすると、このエラーになる。
業務アプリでありがちなのは、Integerで宣言した変数に32767を超える値を代入しようとした … など。

厄介なのはクエリの実行中にオーバーフローした場合。
大抵はサブクエリを含むと思うが、どのクエリの?どの式で?オーバーフローが発生したかまではVBE(VBAの統合開発環境)で教えてくれないからだ。

こんなとき、貴方がSQLを読めるなら、クエリをSQLビューに切り替えて覗くことを勧める。

とはいえ、AccessはSQLフォーマッタを用意しないので、そのままでは見づらい。
SQLを整形してくれるオンラインサイトを活用しよう。

例えば SQLフォーマッターFor WEB にかけると、こんな感じで整形してくれる。

SQL
SELECT
    T03_住民税.市区町村コード,
    T03_住民税.指定番号,
    Q16_当月人事.社員番号,
    Q11_当月異動届参照.氏名,
    Q11_当月異動届参照.入社年月日,
    Q11_当月異動届参照.退職発令日,
    Q11_当月異動届参照.異動後会社コード AS 当月会社コード,
    Q11_当月異動届参照.市区町村コード AS 当月市区町村,
    Q11_当月異動届参照.会社コード AS 前月会社コード,
    Q12_前月異動届参照.市区町村コード AS 前月市区町村,
    T03_住民税.[9] AS 前月住民税,
    T03_住民税.[10] AS 当月住民税,
    IIf(
        [当月住民税] <> [当月徴収税額],
        '税額相違',
        ''
    ) AS 税額相違,
    IIf(
        [当月住民税] <> [前月住民税],
        '税額変更',
        ''
    ) AS 税額変更,
    IIf(
        [当月住民税] = 0,
        '当月抹消',
        ''
    ) AS 当月抹消,
    IIf(
        [当月会社コード] = '',
        '',
        IIf(
            [当月会社コード] <> [前月会社コード],
            '会社変更',
            ''
        )
    ) AS 会社変更,
    T03_住民税.年税額,
    T03_住民税.[6],
    T03_住民税.[7],
    T03_住民税.[8],
    T03_住民税.[9],
    T03_住民税.[10],
    T03_住民税.[11],
    T03_住民税.[12],
    T03_住民税.[1],
    T03_住民税.[2],
    T03_住民税.[3],
    T03_住民税.[4],
    T03_住民税.[5],
    Q18_当月徴収税額.住民税 AS 当月徴収税額
FROM
    (
        (
            (
                Q16_当月人事
                LEFT JOIN
                    Q11_当月異動届参照
                ON  Q16_当月人事.社員番号 = Q11_当月異動届参照.社員番号
            )
            LEFT JOIN
                Q12_前月異動届参照
            ON  Q16_当月人事.社員番号 = Q12_前月異動届参照.社員番号
        )
        LEFT JOIN
            T03_住民税
        ON  Q16_当月人事.社員番号 = T03_住民税.社員番号
    )
    LEFT JOIN
        Q18_当月徴収税額
    ON  Q16_当月人事.社員番号 = Q18_当月徴収税額.社員コード
WHERE
    (
        T03_住民税.[9] <> 0
    )
OR  (
        T03_住民税.[10] <> 0
    )
ORDER BY
    T03_住民税.市区町村コード,
    T03_住民税.指定番号,
    Q16_当月人事.社員番号

これで怪しそうな箇所が、ひと目で分かる。
今回は入力データに不備があり、ゼロで除算したことによるオーバーフローであった。
クエリで発生するオーバーフローは、このパターンが多い。