Microsoft Access 掲示板

モジュールでカレントフォームのコントロールを使うには / 1

6 コメント
views
1
sk 2026/03/18 (水) 11:06:35 修正 97383@4e51d
Forms(foName).Controls(taDt)

上記のコードは、Controls オブジェクト/コレクションの既定のプロパティである Item の記述を省略したものです。
Item プロパティの引数 Index に渡すことが出来るのは、次のいずれかです。

  1. 参照したいコントロールの番号を示す整数

  2. 参照したいコントロールの名前を示す文字列

引数 Index に整数(番号)を渡す場合、その最小値は 0、最大値は Controls コレクションに含まれるコントロールの総数から 1 を減じた結果です。

Function AddDt(taDt As Variant,reqNum As Integer)

そして例示されたコードでは、Controls.Item プロパティの引数 Index に対して AddDt プロシージャの引数 taDt を渡しているわけですが、

If IsNull(taDt) Or IsDate(taDt) = False Then

もし Variant 型の引数 taDt に渡されたのが Date 型のデータである場合、Controls.Item プロパティの引数 Index にそれを渡した際、暗黙的に整数データに型変換され、上記 1 のケース(番号を渡す)として処理されます。

例えば、渡された Date 型の値が #2026/03/18# だった場合は 46099 という整数に置き換わります。

実行時エラー2458 コントロールの数よりも大きな番号になっている

この時、渡された整数が Index に渡すことのできる番号の上限(フォーム上に配置されている全てのコントロールの数から 1 を減じた結果)を超えていれば、実行時エラー 2458 (正しいメッセージは「コントロールの数よりも大きなコントロール番号が指定されています。」)が発生することになります。

つまり、コントロールを参照するための引数(番号または名前)に対して Date 型のデータを渡していることがまず誤りである、ということです。

入力フォームに日付フィールドがありそれを+-ボタンで加算しています。

複数のフォームを同様にしてますので、コードを共通化したい

「日付フィールド」が連結コントロールであるか否か、「+-ボタン」のコントロールの種類は何か、といった要件等によりますが、恐らく標準モジュールよりクラスモジュールを使用した方が良いケースではないかと思います。

通報 ...