先日、Accessでシステム制作を行っていたときに
引数が無効です
というエラーメッセージが表示されました。しかし、このエラーが発生する理由がさっぱりわからなく、いろいろ調べた結果、Accessの不具合(バグ)だったということがわかりました。下記にその状況を簡単に説明します。
状況
今回のシステムではAccess 2013で1ファイルのみで動作するデータベースです。OSはWindows 8(←特に今回のバグとは関係ないです)、VMwareのバーチャル環境で開発を行っていました。
システムの詳細はちょっと書けませんが、簡単に書くとあるテーブルがあり、そのテーブルから選択クエリを作ってフォームのレコードソースに設定しているというごく普通のシステムです。
エラーが発生するのはそのフォームである処理(例えばボタンクリックなど)を行うとテーブル内のデータを全てクリアするVBAのプログラムを下記のように書いていました。
Dim con As New ADODB.Connection
Dim com As New ADODB.Command
Set con = CurrentProject.Connection
com.ActiveConnection = con
com.CommandText = "DELETE * FROM table1;"
com.Execute
Set com = Nothing
con.Close: Set con = Nothing
現象
フォームをフォームビューで表示させ、その処理を行うと上記プログラムの「com.Execute」の部分でなぜか
実行時エラー -2147467259(80004005)
引数が無効です
とエラー表示されるのです。引数なんてないし、なぜこの場所でこのようなエラーが発生するのかがさっぱりわかりません。そのエラーを無視して一次停止したプログラムをそのまま続けようとすると、なぜか普通に動き出します。
「へ?」
エラーがあるならそのまま同じエラーを返すはずなのに何事もなかったように実行できるのです。
さらに不思議なことに、そのままもう一度この処理を実行すると、今度はエラー無しで普通に動くのです。
さらに、別のソースでSQLを実行しようとすると、同じ「com.Execute」で

「プロシージャーの呼び出し、または引数が不正です。」のエラーメッセージ
実行時エラー 5
プロシージャーの呼び出し、または引数が不正です。
のエラーが出ます。これも一度だけで、その後は問題なく実行できます。もう、わけがわかりません。
原因
もう、こうなるとGoogle先生しかいません。調べてみたら直ぐに下記ページが出てきました。
Access 2010 または Access 2007 SP3 でテーブル編集時に、初回のみ “引数が無効です” とエラー メッセージ表示される
この中に書かれている「回避策」を行ってみたらすんなりと解消されました。つまり、Access側の問題です。
ここで、「原因」を読んでみると
テーブルのフィールド数よりも多いフィールド数分の設定情報が保持されていると認識されるために発生します。
と書かれています。思い当たる部分としてはここで使用しているテーブルのフィールド(カラム)数が非常に多く、テーブルで設定できる数(256フィールド)に対して200近くのフィールド数があります。もしかしたら、これが原因の一つかもしれません。ただ、同じ様にフィールドの数が多い別のテーブルではこのような現象が発生しませんので、何か別の要因が重なると発生するのかもしれません。
Microsoftのサイトでは「Access 2010 または Access 2007」とありますが、今回はAccess 2013で発生しているので、バージョンはあまり関係がないかもしれません。同じ様な症状が発生した方はお試しを!