Microsoft Access 掲示板

フォームからLookupテーブルのレコードを追加し、それを同じフォーム内の複数コントロールに即時反映させる

6 コメント
views
4 フォロー

Access初心者です。
Webシステムに入力するデータを収集するためにAccessを使おうとしております。
そんため、次ぎのような構成のテーブル・フォームを作っています。

 メインテーブル・サブテーブル所属・サブテーブル役職
 メインフォーム・サブフォーム所属追加用・サブフォーム役職追加用

メインテーブルから、サブフォーム呼び出しボタンを作り、そのボタンをお酢と追加用サブフォームが立ち上がり、所属や役職を追加修正する形にしています。
このサブテーブルの変更を、メインフォームにある複数のコントロール(所属1、所属2,所属3など)のコンボリストに、”自動的に”かつ”すぐに”反映させたいのですが、出来ていません。

以下、私のトライしたことです。

(1)メインテーブルとサブテーブルとのリレーションを作り、連鎖更新をONに。この形で、サブテーブルに変更を加えると、メインフォーム上のいくつかのコンボリストは更新されるのですが、全てのコンボリストは更新されません。。。。

(2)サブテーブルの更新をした後に、F9ボタンを押して更新する。全てのコンボボックスでアップデートされる。

(3)メインフォームに「Requeryマクロ」を作り、新しいRequeryボタンに割り当てます。サブテーブルの更新をした後に、「Requeryボタン」を押す。全てのコンボボックスでアップデートされる。

(4)メインフォームのいろいろなイベントに、Requeryマクロを割り付けるも上手くいかず(全てのイベントは試していません)

どうしたら、サブテーブルを更新後、自動かつ即時に、メインフォームの全てのコンボボックスをアップデートできるのでしょうか?
ヒントや方法など教えてください。よろしくお願い致します。

Accessって敷居が高い
作成: 2020/05/01 (金) 07:58:46
通報 ...
1
hiroton 2020/05/01 (金) 09:51:41 c385e@f966d

(3)メインフォームに「Requeryマクロ」を作り、新しいRequeryボタンに割り当てます。

作業手順がよくわかりません。
「Requeryマクロ」とはリボンの[作成]タブにある[マクロ]メニューから作成したマクロですか?

イベントとは、ユーザーの操作に対応して発生・実行されるものです。

「Requeryボタン」を押す。

と、Requeryボタンのクリック時イベントが発生します。

今回やりたいことは「サブテーブルを更新後に何かしたい」なので、「サブテーブルを更新したと判断できる作業」のイベントにマクロを設定する必要があります。
操作中のフォーム「サブフォームのイベントにマクロを設定する」と良いでしょう。

具体的にはサブフォームの更新後処理が「”自動的に”かつ”すぐに”」に合うかと思います。


”すぐに”を本当に「すぐに」にしたいのであればサブフォーム上の個別のコントロール(所属や役職)それぞれの更新後処理イベントを使うという方法もあります。

逆に、サブフォームで作業したあと、メインフォームで作業する前にサブフォームは閉じるという手順があるのであれば、サブフォームの閉じる時イベントでもいいのではないかと思います。


「サブフォーム」という言葉はACCESSではあるフォームの中に組み込まれたコントロールとしてのフォームを指す言葉として使われます。
誤解を招きやすいので「入力用フォーム」としたり、あるいは「AフォームとBフォームを作ってAフォームからBフォームを呼び出しています」等の前置きから質問すると良いです。

2
Accessって敷居が高い 2020/05/02 (土) 09:44:26 e08ac@b63e9

アドバイスありがとうございます。
初心者なので、間違った語句の使い方はご容赦を。

ご指摘のとおり
テーブル: メインテーブル、所属テーブル、役職テーブル
フォーム:メインフォーム、所属追加フォーム、役職追加フォーム

3
Accessって敷居が高い 2020/05/02 (土) 10:07:26 e08ac@b63e9

アドバイスありがとうございます。
初心者なので、間違った語句の使い方等はご容赦を。

ご指摘のとおり
 テーブル: メインテーブル、所属テーブル、役職テーブル
 フォーム:メインフォーム、所属追加フォーム、役職追加フォーム
の構成です。
メインフォーム中の、所属と役職を選択するコンボボックスがそれぞれ5個あり、それぞれ所属テーブルと役職テーブルを参照する形(Lookup)にしてあります。
メインフォームから、所属追加フォームと役職追加フォームを呼び出して、所属や役職を追加し、その追加修正をメインフォームの合計10個の所属・役職コンボボックスに即時かつ自動的に反映させたいのです。

所属追加フォームや役職追加フォームには、「レコードセーブボタン」、「フォームを閉じるボタン」を配してあります。アドバイス頂いたように、この2つのボタンのon-clickイベントマクロにRequery(コントロールなし)で追加するのですが、全くメインフォームには反映されない、あるいは1つのコンボボックスだけ反映されるなど、不思議な挙動をします。
この他にAfter UpdateイベントマクロにRequery(このトロールなし)を加えても同じ。追加フォーム上に「Requeryボタン」を作ってon-clickイベントでRequeryをさせても、全く同じ挙動。VBAコードとしてon-clikイベントでMe.Requeryなども試しましたが反映されず。

唯一、所属追加フォームや役職追加フォームの変更を反映させることができる動作は
(1)メインフォームにおいて、Shift-F9
(2)メインフォームにおいてRequeryを行う。

この他、Relationshipで連鎖更新もONにしてあるのですが、Joinタイプを変えるとか、私の思いつく範囲でいろいろ試してみたのですが、私の知識・経験では(1)(2)でしか実現できません。

しかし、この(1)(2)を行うと、現在入力しているレコードから、一番先頭のレコードに飛びます。User Unfriendlyも甚だしいので、なんとか、Macroを使ってCurrentRecord番号をゲットして、Requery後にGoToRecordで元のレコードに飛ばそうと思っているのですが、マクロでCurrentRecordのゲットの書式が分かりません。。。。
マクロだからeasyかと思いましたが、VBAとは違って、[TempVars]![MyVal]のフォーマットだし、かといってMacroの書式について初心者向けの資料もないし。。。。

どうしてこんな簡単なことが、ここまで難しいのか。。。。
やっぱりAccessは使うべきではないなと-と感じています。FileMakerにしておけば良かった。でも関係者にFileMakerを買わせる負担を掛ける訳にもいかず。。。。
Accessのフォーラムにこんなこと書くのは失礼かもしれませんが、Accessって基本思想自体が間違っていると感じます。

4
Accessって敷居が高い 2020/05/02 (土) 11:03:45 e08ac@b63e9

(2)を使って解決しました。

SetTempVar
  Nme

5
Accessって敷居が高い 2020/05/02 (土) 11:05:55 e08ac@b63e9 >> 4

(2)を使って解決しました。

SetTempVar
  Name CurrentRecordNo
  = [Forms]![Frm_Name].[CurrentRecord]

Requery

GoToRecord
  Record  GoTo
  Offset  =[TempVars]![CurrentRecordNo]

6
hiroton 2020/05/02 (土) 11:27:28 1bf02@f966d

長々と回答を考えていたら解決のレスが・・・

VBAコードの一例を載せておきます。

'所属追加フォームのモジュール'
Private Sub レコードセーブボタン_Click()
    Forms!メインフォーム!所属.Requery
End Sub

フォーム自身を更新せずに所属や役職のコントールをそれぞれ更新すればスクロールは発生しません。

マクロだからeasyかと思いましたが、VBAとは違って、[TempVars]![MyVal]のフォーマットだし、かといってMacroの書式について初心者向けの資料もないし。。。。

フォーマットについてはVBAでも変わりませんね。

資料の有無でいえば圧倒的なのはそうですねぇ。
マクロだからeasyというよりは簡易機能ならマクロでもできるって感じですね。