• ベストアンサー

ACCESSにて

フォーム内にサブフォームを作り、情報を表示させています。 登録してテーブルを更新された際に、サブフォームを更新したいのです。 今考えているのは、更新ボタンを用意して、クリックしたら表示が更新される、というのを考えています。 マクロコードなどを教えてもらえないでしょうか。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • gadd3
  • ベストアンサー率46% (211/451)
回答No.1

Requeryというメソッドを使うとよいと思います。 ただ、Requeryを使うと通常の方法ではカレントレコードが先頭に戻ってしまいますので、カレントレコードがそのままで、更新できるようにします。 以下、私の覚書をそのままコピペします。 ******************************************************* ●Requeryしてもカレントレコードを移動しないようにする方法 言い換えると、カレントレコードを移動させないでRequery(更新)する方法 サブフォーム(単票、帳票どちらでも可)を作って、 サブフォーム/サブレポートコントロールに対してRequeryをかけるだけでそうなる。 サブフォーム/サブレポートコントロール名 は通常はサブフォーム名と同じ場合が多い。サブフォーム/サブレポートコントロールは埋め込みオブジェクト。 サブフォームは、サブフォーム/サブレポートコントロールと実際のフォームの2つから成っている。そこを理解しておかなければならない。 メインフォームだけを作ってサブフォームを作らない場合、つまり、直接メインフォームでデータを表示させ、Me.Requery とやる場合は当然ダメ。 APIを使う方法などの他の方法でやらなければならない。 ●メインフォーム上のコマンドボタンでRequeryする場合 コマンドボタンのクリック時イベントに次のように書く。 Forms("メインフォーム名")("サブフォーム/サブレポートコントロール名").Requery または Me("サブフォーム/サブレポートコントロール名").Requery ●サブフォーム上のコマンドボタンでRequeryする場合 メインフォーム名やサブフォーム名を汎用的な感じのコードでやってみた。 ボタンのクリックイベントに書く。 '『 実行時エラー '2118' ' "Requery/再クエリ"アクションを実行する前に、 '  カレントフィールドを保存する必要があります。』 'が出たら以下の1行を足す。出なければコメントアウト。 '念のためコメントアウトしないほうがいいかも DoCmd.RunCommand acCmdSaveRecord 'リクエリをする。 'より汎用的にするには、Parentを使わないほうが 'いいのかもしれない。 Parent(Screen.ActiveForm.ActiveControl.Name).Requery ●メモ サブフォームのどこかのコントロール(テキストボックスなど)にフォーカスがある場合、そのサブフォームを格納するサブフォーム/サブレポートコントロールの名前を取得するには、 Screen.ActiveForm.ActiveControl.Name で取得できる。 サブフォームにフォーカスがある場合、 Screen.ActiveForm.Name を実行すると、メインフォームの名前が出てきてしまう。 しかし、逆にいうと、サブフォームにフォーカスがある場合なら メインフォームのサブフォーム/サブレポートコントロールが絶対にアクティブになっているはずなので、それを利用する。 「Parent」の部分は、Meでも良いし、オブジェクト変数名でもよい。 が、オブジェクト変数名のほうが汎用的にしやすいのでそちらのほうがいいと思われる。 以上のことから、フォームを作成するときは、基本的には できるだけサブフォームを作ったほうがよいかもしれない。 これ以外のメリットもあるし。 「メインフォーム上にデータを表示しないといけないとき」は 無理しないで、普通にメインフォームを使えばいい。 サブフォームの中のサブフォームというのもまた面倒になるので。 もしくは、サブフォームのサブフォームが必要な場合は、別フォームを開く形にして、 そこでもメイン+サブという形を貫くか。そうすると汎用コードが作りやすくなるかもしれない。 別に2画面同時に表示することもできるわけなので。

関連するQ&A

  • Accessでメイン、サブフォームへの入力について

    accessほぼ初心者です。 取引先の会社情報を管理するために、access2007で顧客管理を作成しています。現在、取引先本社情報とその支店情報を登録するフォーム「会社登録フォーム」を作成していますが、次のようなことで困っています。 <問題としていること>: 「サブフォーム」をクリックした瞬間に、テーブルにレコードが追加されてしまう。 <改善したいこと>: 本社テーブルの会社名が未入力ならば、上記の操作でレコードを追加しない。(会社名に主キーは設定していません。) <会社登録フォームの環境>: 会社の本社情報をメインフォーム、その会社の支店情報をサブフォームに、単票形式のタブコントロールで複数画面にして支社ごとに分けて入力できる登録フォームを作成しました。本社テーブルの会社IDを主キーに、支店テーブルの支店IDを主キーにしてリレーションシップを設定しています。 <会社情報の入力に関して行っていること>: ・メインフォームに「新規」「更新」「削除」ボタンを設置。 ・新規ボタンでメインフォームの「会社ID」に自動採番。 ・会社(本社)名がないと困るので、未入力の状態で「新規」「更新」及び「サブフォーム」をクリックされた際に「会社名が未入力です。」のメッセージを表示され「OK」で元の状態にもどります。 ・会社(本社)名が入力済みならば、「更新」ボタンで、メッセージ「OK」「キャンセル」が表示され、「OK」ならば本社テーブルにレコードが追加され「キャンセル」ならばそのままの状態になります。 上記の<問題としていること>の補足ですが、新規ボタンで新規登録フォームに会社IDが自動採番(末番)されるのですが、「会社名」を入力せず、先にサブフォームの支店情報から(タブ名「支店(1)」)入力しようとした場合、「会社名が未入力です。」のメッセージを表示されますが、この時点で本社テーブルに、この採番でレコードが追加されてしまいます。入力者がそのまま会社名(本社)から入力するも、途中でキャンセルした場合、再度新規登録をする際、登録フォームの自動採番がキャンセルされた採番の次の番号になります。 キャンセルされた会社情報空白のレコードができるということになります。これを回避したいのです。 出来るだけ詳細をとおもい説明が長くなりましたが、よろしくお願いいたします。

  • Access2000 フォーム/サブフォームについて

    質問させていただきます。 フォーム/サブフォーム形式で画面を作っています。サブフォームは帳票形式で、複数のレコードを表示しており、各行の左にコマンドボタンを用意し、それをクリックすると、更新クエリー、削除クエリーが動くようにしています。 しかし、更新、削除クエリーとも ”0件のレコード”で処理が正しく動作しません。 ちなみに、両クエリの抽出条件は・・・ [Forms]![メインフォーム]![サブフォーム]![商品コード] しかし、フォームを使わずクエリーから実行する(パラメータに条件を手入力する)と正しく動作します。 記述ミスがないか何度も見返したのですが・・・。 「サブフォームの目的の行の商品コードと一致するデータを処理する」としたいのですが・・・。

  • ACCESSのフォームとサブフォームについて

    いつもみなさんにはお世話になっております。 ACCESS2000を使用しています。 テーブルA,B,Cを用意しフォームにサブフォーム、リストボックス、ボタンを配置し、リストボックスの表示内容(A,B,C)に合わせてボタンクリックでサブフォームの表示テーブル(A,B,C)を変更したいのですがどうしたら良いのか解りません。 みなさんどうかよろしくお願いします。

  • Access2003 サブフォームについて

    サブフォームを持つ画面で 親子テーブルを共に更新しようとしていて挫折しかかっています。 そこで皆様の知恵を借りれれば幸いです。 <<画面表示>> メインフォーム…受注  ┗サブフォーム…受注明細 <<更新条件>> ・メインフォームは変更可能 ・サブフォームは追加、変更、削除可能 ・サブフォームのデータ変更時  →受注明細テーブルを更新しない ・メインフォームのデータ更新時  →受注テーブルを更新しない ・メインフォームの更新ボタン押下時  →受注テーブル、受注明細テーブルを更新 <<質問>> 1.サブフォームの値をテーブルへ  自動更新(項目変更時に付随更新)せずに  任意更新(ボタン押下時など)出来ますか?  [サブフォームに主キー項目を設置せず行追加すると Not Null制約で怒られます。] 2.VBで言うところのFlexGridの様にサブフォームを  制御出来ますか?  RecordSourceを使うのではなく、  VBA内で持っている値を各セルに設定する 3.そもそも同一画面内で親子テーブル共に更新することは  有り得ないことなんでしょうか?

  • アクセス サブフォームの使い方

    フォームにテキストボックスとコマンドボタンサブフォームが1つづつありま す。 やりたいことは、テキストボックスに入力した条件でコマンドボタンを押すと サブフォームに結果が表示されるというものです。 ID 分類 名称 1  花  バラ 2  花  ユリ 3  昆虫 カブトムシ とテーブルがあった場合、 テキストボックスに 花 を入力すると サブフォームに バラとユリが 表示されるというものです。(実際にはフィールド数はもっとあります。) コマンドボタンにクエリの実行を登録し、サブフォームはクエリをベースに作 成しました。 コマンドボタンをクリックするとクエリの結果が表示され(当たり前ですね) サブフォームは白紙のままです。 ファームのデザインビューをクリックし、再度フォームを表示すると結果は反 映されます。 この、クエリの結果を表示せず、かつサブフォームに結果を表示させる方法を 教えてください。

  • ACCESS2003でサブフォームを使う

    すみませんが教えてください。 親フォームの中に、サブフォームを作ります。 サブフォームにはクエリの内容が表示されています。 そのサブフォームの内容を、親フォームに表示させたいです。 (サブフォームをクリックすると、親フォームの内容も切り替わる) VBAが必要なのでしょうか。 もしそうであれば、参考になるページ、もしくはコードを教えていただけるとありがたいです。 現在、親フォームのほうには [Forms]![登録内容クエリ2フォーム]![登録内容マスタのサブフォーム] ![Forms]![内容]と設定しているのですがこのままではうまくいかないのですね;; ヨロシクお願いします。

  • Access、更新用データと連結したフォーム

    度々の質問で恐縮です。 検索フォームの検索結果を、レコードセレクタのWクリックで、 更新するためのテーブルと連結したフォームを開いて、 そのフォーム項目に「値の代入」をしています。 で、その「更新用データのフォーム」で更新項目を編集し、 ボタンを押すと「フォームと連結したテーブル」を使った更新クエリを実行する、 というマクロを実行するようにしてみました。 その処理を実行後、「更新用のフォーム」を閉じて、最初に書いた検索フォームで 検索すると、更新実行結果が反映しません。 レコードセレクタのWクリックを抜きにして、直接「更新用フォーム」を開き、 そのフォームにある「更新用のマクロ」を実行するボタンをキックすると反映します。 で、今は更新用フォームからマクロをキックするボタンは消して、 更新用フォームを閉じると、更新用データのテーブルは更新項目を反映しますので、 直接「更新用マクロ」をキックするだけのボタンしかないフォームを別に開いて、 そのボタンを押すようにしています。 最初の構成で、つまり、「更新用フォームで編集し、その画面のボタンで 更新用マクロをキックして更新実行したい」のですが、編集内容が 「更新データテーブル」に反映するには、どうすれば良いでしょうか? くだくだしい説明を書いてしまい、まことに申し訳ありませんが、よろしくお願いします。

  • ACCESS2000で履歴を取った後、最新の履歴の日付を表示したい!

    ACCESS2000で、現在、顧客情報フォーム、(その中に)サブフォーム担当者情報があり(顧客コードが一致)、その履歴をテーブルに書き出した後、その履歴テーブルの更新日付を見て、最新の情報(最新更新情報)を取り出して、顧客情報フォームに(顧客コードの一致で)日付を表示するということがしたいのです。できますでしょうか?本当は、それと一緒に更新者名も取り出したいのですが、・・・。更新者名については、セキュリティーをかけると、そこに登録した名前で履歴を取ることができました。(今のところ確認できたのは、更新したところだけを履歴に残すバージョンで、テーブル全体の履歴を残すバージョンは、これからTRYしてみます。) 更新者の情報を獲得するには、セキュリティーを使用する方法しかないのでしょうか? と・・・、いっぱい質問を書いてしまいました。何卒よろしくお願い申し上げます。

  • アクセスのサブフォーム

    よろしく、お願いします。 アクセスのサブフォームをVBAでテーブルに登録する方法を教えてください。 フォームからメインテーブルとサブテーブルへ、ボタン一つで同時に登録したいのです。 よろしく、お願いします。

  • アクセスでの詳細表示のしかた

    新規採用の応募者のDB作成しました。 学校の種別(大学院、大学、高校)や学校名で検索(クエリ)のフォーム(A)に、応募者テーブルを基にしたデータシート型のサブフォーム(B)を埋め込みました。 ここまでは、学校名の一覧表示のフォーム(O)に詳細表示用のボタンを配し、マクロで上記のサブフォームを含む、学校情報フォーム(A)を開くのはできました。 次に、このサブフォーム(B)中の応募者のID(氏名でも)をダブルクリックすると、応募者の詳細表示フォーム(C)を表示できるようにしたくて、応募者IDのコントロールのプロパティでイヴェントのダブルクリックにマクロを設定しました。 (C)フォームを開く where条件として [フォーム(B)]![応募者ID]=[フォーム(C)]![応募者ID]としても、左項の値が右項へ代入されず、うまく行きません。 どうしたら、サブフォーム(データシート)の帯び データから特定のレコードを指定して、更に別のフォーム(特定レコード)の表示が可能なのでしょうか? 不慣れで、説明もままならないこんな私にどなたかHELP!

専門家に質問してみよう