質問: forms("form").controls("subform").form.currentrecord forms("form").controls("subform").requery docmd.gotorecord acactivedataobject, forms("form").controls("subform"), acgoto, i end sub これをすると、実行時エラー2498 指定した式は、いずれかの引数とデータ型が対応していません。 になりますが、 どこがおかしいのでしょうか?
回答: 【要旨】 サブフォームのレコード移動では、対象サブフォームは引数で指定するのではなく、 setfocusメソッドで移動後、引数を省略したgotorecordを使用します: forms("form").controls("subform").setfocus docmd.gotorecord , , acgoto, i 但し、「requery前後でのレコード移動の回避」が目的の場合は、requeryの 対象を「親フォームまたはサブフォームのformオブジェクト」ではなく「サブフォーム コントロール」とすればokです。 <現状・例1> forms("form").setfocus docmd.requery <現状・例2> forms("form").requery <現状・例3> forms("form").controls("subform").form.requery <代替策> forms("form").controls("subform").requery ※「現状・例3」との違い(→途中の「.form」の有無)に注意。 【詳細】 > 実行時エラー2498 このエラーの直接の原因は、gotorecordメソッドの第2引数に指定している 「forms("form").controls("subform")」の部分です。 ここに指定するのはオブジェクト名になりますが、そのデータ型は文字列型です。 一方、「~.controls(~)」の形で指定した場合、取得できるのは a)オブジェクトそのもの b)そのオブジェクトのデフォルトプロパティ のどちらかです(→状況によって変化します)。 (例えばテキストボックスなら、textboxオブジェクトまたはvalueプロパティの値) サブフォームのデフォルトプロパティは調べていませんが(汗)、少なくとも文字列 型のプロパティではないため、「型が一致しない」とのエラーとなります。 サブフォームのコントロール名を取得する場合は、 forms("form").controls("subform").name というように、nameプロパティを明示的に指定する必要があります。 ただ、「サブフォームのレコード移動」の場合、明示的に「name」プロパティを 指定しても解決には至りません(汗) これは、gotorecordメソッドの第2引数には、直接開いているオブジェクトの 名前のみが有効なためで、サブフォームを直接的に指定することはできない、 ということです。 (注:microsoftの資料を探したわけではなく、経験則から記述していますので、 私の勘違いでしたらご容赦願います(汗)) サブフォームのレコード移動には、冒頭に記述したとおり、「フォーカスの移動」と 「一部の引数を省略したgotorecord」を使用します: forms("form").controls("subform").setfocus docmd.gotorecord , , acgoto, i なお、これも冒頭に書きましたが、サブフォームのrequeryの仕方には幾つか 方法がありますが、requeryの対象を「コントロールとしてのサブフォーム」にすれば、 レコード移動が発生しませんので、gotorecord自体が不要になります。 http://www.f3.dion.ne.jp/~element/msaccess/actipsfrmhowtorequeryandreturn.html