Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
  • 締切済み

ACCESS メインFからサブFの値を参照

サブフォームで集計した値をメインフォームで演算値として使用したいのですができません。 サブフォームのフォームヘッダに集計値を入れるテキストボックスを配置し、メインフォームにサブフォームの集計値を参照するテキストボックスを配置しています。 ほんとうはイベントの実行で直接サブフォームの集計値を使った演算を行いたいのですが出来ないのでメインフォームにテキストボックスを作成しました。 サブフォームの集計値は表示しますが、その値を演算値として使用できないのです。試しにMsgboxでメインフォームのテキストボックスの値を表示させると何も表示しません。 なぜメインフォームのテキストボックスにサブフォームの値は表示できるのにその値を使用できないのでしょうか? 具体的には次の通りです。 <サブフォームに配置したテキストボックス>  名前        :テキスト16  コントロールソース:SUM([枚数〕)  書式        :数値 <メインフォームに配置したテキストボックス>  名前        :テキスト130  コントロールソース:[Foms]![メインフォーム名]![サブフォーム名].Form!テキスト16  書式        :数値 <イベント>   MSGBOX テキスト130       ※何も表示されません!

みんなの回答

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.5

(1) まず、以下のようにしてみてください。 >If [テキスト112] <> [テキスト130] Then If CLng(Me![テキスト112]) <> CLng(Me![テキスト130]) Then (2) >そこで、サブフォームの合計値がメインフォームで参照できるか >インフォームに確認用テキストボックスを作成し確認すると >サブフォームの合計値 は表示されるものの、そのテキスト名 >による比較演算ができない。そこで、MSGBOXにより >テキストデータを表示させてみると何も表示されない。 >LEN関数で文字長を表示してみるとデータ長は0である。 (1)や上記の操作は、どのようなイベントのときに実行されていますか。 メインフォームのテキストボックスにサブフォームのヘッダーの 合計値を表示しようとすると、メインフォームのテキストボックス にはかなり遅れて表示されます。たとえばこれらの一連の流れを フォームのオープン時のイベントに行なうとメッセージボックスで データを取得しようとするとデータはまだ入ってきていない状態で メッセージボックスが表示され、当然ながらメッセージボックスには 何も表示されません。 そのあたりはどうなのでしょうか。

nodapapa
質問者

お礼

回答ありがとうございました。 教えて頂いた通り  If  CLng(Me![テキスト112]) <> CLng(Me![テキスト130])  Then としてみましたが駄目でした。 試しにブレークポイントを設定しテキストデータの内容を確認したところ  Me![テキスト112]=1    ’メインFのテキストデータ  Me![テキスト130]=1    ’メインFへ引継いだサブFの合計値テキストデータ と表示され、確かにサブフォームの合計値はメインフォームへ引き継がれて いるのですが比較演算では偽の判断をしてしまいます。 試しにテキストデータをMsgboxで表示させると  Msgbox CLng(Me![テキスト112])   ⇒  1を表示  Msgbox CLng(Me![テキスト130])   ⇒  0を表示 なぜ、[テキスト130]の値がこのようになるのかますます解らなくなってしまいました。 どのようなイベントのときに実行されていますか? ということですが フォームのオープン時のイベントではなく、メインフォーム及びサブフォームに 一通りデータを入力を行った後に「登録」というコマンドボタン押下時のイベント として実行しています。 言われる通り、サブフォームで入力した合計値がメインフォームに少し遅れて 表示(約1秒程ですが)されます。 たびたび申し訳ありませんが、何か他に原因と思われるところについて教えて 頂けないでしょうか。よろしくお願いいたします。

すると、全ての回答が全文表示されます。
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.4

試しに新しいフォームを作り、そこにツールボックスで 「ブフォーム/サブレポート」というコントロールを 選択し、フォームに貼り付けてください。このとき 貼り付けたコントロールのプロパティを表示し、 名前を確認すると「埋め込み0」のような名前に なっていると思います。そしてソースオブジェクトに サブフォームとするフォームを指定すればコントロールに サブフォームが表示されます。実際に表示すると サブフォームが表示されている枠が見かけ上 このコントロールにあたります。 ここでメインフォームを基準にするとサブフォーム上の テキストボックスは、 メインフォーム→サブフォーム表示コントロール→サブフォーム →テキストボックス というようにしてたどることになります。じつはこの サブフォーム表示コントロールの存在を見落とすために サブフォームにあるテキストボックスのようなコントロール を参照するときにエラーが出たり、データを取れなかったり するのです。上記を書き変えると、 Forms![メインフォーム名]![サブフォーム表示コントロール名].Form![テキストボックス名] となります。 実際にあわせてコントロールソースとする場合は、 =Forms![メインフォーム名]![埋め込み0].Form![テキストボックス名] すなわち、 =Forms![メインフォーム名]![埋め込み0].Form![テキスト16] あるいは、単に、 =[埋め込み0]!テキスト16 のようにします。ただし他のフォームや同じメインフォームに 他のサブフォームが設定してあって、そこから他のサブフォーム上の コントロールを参照するときは、 =Forms![メインフォーム名]![埋め込み0].Form![テキストボックス名] のような書き方をしなければなりません。 以上のように上記ではサブフォーム名はでてきません。 No1で、 >[サブフォーム表示コントロール名]が[サブフォーム名]として名前が >変更されていれば問題は無いと思いますが。 と回答したのは、「サブフォーム表示コントロール」は初期値は「埋め込み0」 というような名前になっていますが、この名前をプロパティでサブフォーム名と 同じ名前に変更した場合は正常にデータが表示できるはずだと思ったからです。 この場合は「サブフォーム名」は「サブフォーム表示コントロール」の名前として 認識されます。 だいたい、このような感じですが。

nodapapa
質問者

お礼

さっそく回答を頂きありがとうございました。 [サブフォーム表示コントロール名] 「埋め込み0」の意味が理解できました。 チェックしてみましたが、[サブフォーム表示コントロール名] は「埋め込み0」では無くサブフォーム名になっていました。 ご迷惑でなければ他に考えられる要因があれば教えて頂けないでしょうか。 今の現状を少し整理してみたいと思います。 (1)私がやりたいこと及び現状  メインフォームのコントロールボタンをクリックすると、サブフォームで入力した数値の合計値(SU  M関数)とメインフォームで表示された数値を比較し同値であれ処理を続行し異なる場合はエラー メッセージを表示させたい。サブフォームの合計値は正常に表示するものの、メインフォームでそ  の数値を反映できないため比較演算ができない。そこで、サブフォームの合計値がメインフォーム  で参照できるかメインフォームに確認用テキストボックスを作成し確認するとサブフォームの合計値 は表示されるものの、そのテキスト名による比較演算ができない。そこで、MSGBOXによりテキス トデータを表示させてみると何も表示されない。LEN関数で文字長を表示してみるとデータ長は0  である。 (2)フォーム設定状況   <メインフォーム>    (1)フォーム名--------- F_FAX送信情報編集    (2)サブフォームコントロール名-- F_FAX送信情報内訳    (3)数値表示用テキスト名-----テキスト112    (4)確認用テキスト名------  テキスト130     ・コントロールソース          =Forms![F_FAX送信情報編集]![F_FAX送信情報内訳].Form!テキスト16      ・書式        数値   <サブフォーム>    (1)フォーム名--------- F_FAX送信情報内訳    (2)合計値を表示するテキスト名-- テキスト16(フォームヘッダへ作成しSUM関数で集計)      ・コントロールソース        =Sum([枚数])      ・書式        数値 (3)メインフォームのコントロールボタンのイベント記述       If [テキスト112] <> [テキスト130] Then MsgBox  "FAX送信情報内訳の枚数が不正です!" End If  ※メインフォームへ確認用テキストボックスを作成する前の記述   If [テキスト112] <> Forms![F_FAX送信情報編集]![F_FAX送信情報内訳].Form!テキス16 Then MsgBox  "FAX送信情報内訳の枚数が不正です!" End If 以上ですが、説明が不十分で解りづらいところがあるかとは思いますが宜しくお願いいたします。

すると、全ての回答が全文表示されます。
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.3

No2です。回答先を間違えてしまいました。No2はスルーしてください。 回答はNo1のままです。 失礼しました。

すると、全ての回答が全文表示されます。
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.2

一応、質問の範囲での回答とします。 たとえば、以下のような「委員会名簿テーブル」があるとします。 フィールドの生徒名は生徒名6でも、生徒名100でもフィールドが 設定できるまでかまいません。 クラス 生徒名1 生徒名2 生徒名3 生徒名4 生徒名5 1-1   田中  佐藤   西田  山崎   内藤 1-2   東   南田   中川 1-3   豊臣  田中   中田  今井 1-4   谷   道上 1-5   徳川  佐竹   佐藤  西岡   中川 これを以下のようなテーブルに簡単に変更できますか? また、下記では質問の最終的な結果を得るには下記の ように「生徒ID」という各生徒を一意に区別するフィールドが 必要になります。これは最後に作るクエリで必要であるということと、 同じクラスあるいは他のクラスに同じ苗字の人物が存在する可能性が あるかもしれないからです。 生徒ID クラス 生徒名 1        1-1  佐藤 2        1-1  西田 3        1-1  山崎 4        1-1  内藤 5        1-2  南田 6        1-2  中川 7        1-3 田中 8        1-3  中田 9        1-3  今井 10        1-4  道上 11        1-5  佐竹 12        1-5  佐藤 13        1-5  西岡 14        1-5  中川 もし、データが多くて大変だというのであれば、以下のようにしてみてください。 (1) 以下のようなテーブルを作ります。 生徒ID  数値型  主キーを設定します。 クラス  テキスト型 生徒名  テキスト型 テーブルの名前を「委員会名簿テーブル」とします。 元の「委員名簿テーブル」を「委員会名簿テーブル元」 とします。 (2) 次に分かりやすく実行できるようにするために、 フォームを作り、そこにボタンを一つ設定します。 ボタンのクリック時のイベントに以下を設定します。 なお、ボタンの名前は出来上がったボタンの名前の ままでいいです。 Private Sub コマンド0_Click() Dim db As DAO.Database Dim rs1 As DAO.Recordset Dim rs2 As DAO.Recordset Dim i As Integer Dim j As Long Set db = CurrentDb Set rs1 = db.OpenRecordset("委員会名簿テーブル元") Set rs2 = db.OpenRecordset("委員会名簿テーブル", dbOpenDynaset) j = 1 rs1.MoveFirst Do Until rs1.EOF For i = 2 To rs1.Fields.Count - 1 If rs1.Fields(i) <> "" Then rs2.AddNew rs2!生徒ID = j rs2!クラス = rs1!クラス rs2!生徒名 = rs1.Fields(i).Value rs2.Update j = j + 1 End If Next i rs1.MoveNext Loop rs1.Close: Set rs1 = Nothing rs2.Close: Set rs2 = Nothing db.Close: Set db = Nothing End Sub 次に、コード表のコマンドバーのツールから 参照設定を選択し、Microsoft DAO xx Object Library の項目に チェックを入れ、OKとします。なお、xx は3.6のような数字です。 (3) (1)、(2)ができたら、ボタンを押して「委員会名簿テーブル」 を確認してみてください。 (4) 次に、「行事Aテーブル」と「行事Bテーブル」 数値型の「生徒ID」というフィールドを追加し、できた「委員会名簿テーブル」 を参照して「クラス」と「生徒名」に合致した「生徒」を入れていってください。 本来は「生徒ID」があれば「生徒名」はこれらのテーブルでは必要はないのですが。 これらのテーブルの「生徒ID」は主キーを設定しません。 たとえば以下のように。 行事Aテーブル 生徒ID 生徒名 参加 1   佐藤    True 3   山崎    True 6   中川    True 行事Bテーブル 生徒ID 生徒名 参加 1    佐藤   False 6    中川   True 13    佐藤   True 14    中川   True (5) 最後にクエリを作成します。下記のSQL文を新しいクエリを SQLビューにして、貼り付けます。 SELECT 委員会名簿テーブル.生徒ID, 委員会名簿テーブル.クラス, 委員会名簿テーブル.生徒名, 行事Aテーブル.参加, 行事Bテーブル.参加 FROM (委員会名簿テーブル LEFT JOIN 行事Aテーブル ON 委員会名簿テーブル.生徒ID = 行事Aテーブル.生徒ID) LEFT JOIN 行事Bテーブル ON 委員会名簿テーブル.生徒ID = 行事Bテーブル.生徒ID; あるいは、以下のようにしてもいいですが、こちらはフィールド名を変更しています。 変更は手動で書き変える必要があります。 SELECT 委員会名簿テーブル.生徒ID, 委員会名簿テーブル.クラス, 委員会名簿テーブル.生徒名, 行事Aテーブル.参加, 行事Bテーブル.参加 FROM (委員会名簿テーブル LEFT JOIN 行事Aテーブル ON 委員会名簿テーブル.生徒ID = 行事Aテーブル.生徒ID) LEFT JOIN 行事Bテーブル ON 委員会名簿テーブル.生徒ID = 行事Bテーブル.生徒ID; 上記のクエリをデザインビューで確認すると、「委員会名簿テーブル」 から「行事Aテーブル」と「行事Bテーブル」に結合線が向かっている ことに注目してください。行事テーブルが追加されるような場合は 結合線の設定を同じようにしてください。 以上です。 わからないところがあれば補足してください。

すると、全ての回答が全文表示されます。
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.1

まず、 > <サブフォームに配置したテキストボックス> >  名前        :テキスト16 > コントロールソース:SUM([枚数〕) > 書式        :数値 のところで、 > コントロールソース:SUM([枚数〕) を > コントロールソース:=SUM([枚数〕) のように、等号をつけます。 同様に、以下のように、 > <メインフォームに配置したテキストボックス> > 名前        :テキスト130 > コントロールソース:=[Foms]![メインフォーム名]![サブフォーム名].Form!テキスト16 > 書式        :数値 コントロールソースに等号を追加します。、 これで、データが表示されないようであれば、コントロールソースの =[Forms]![メインフォーム名]![サブフォーム名]!.Form!テキスト16 を、 =[サブフォーム表示コントロール名]!テキスト16 としてください。ここで[サブフォーム表示コントロール名]は メインフォームにおいてサブフォームを表示するコントロール名で、 初期値は「埋め込み0」のような名前になっています。 [サブフォーム表示コントロール名]が[サブフォーム名]として名前が 変更されていれば問題は無いと思いますが。

nodapapa
質問者

お礼

回答頂きありがとうございました。 (間違えて補足の記述欄に同じ内容を入れてしまいました。) コントロールソースの記述で等号(=)を入れるとのご指摘ですが、 質問の記述での記入漏れで実際には等号(=)は入れています。 そこで、次にご説明を頂いた 「これで、データが表示されないようであれば、コントロールソースの =[Forms]![メインフォーム名]![サブフォーム名]!.Form!テキスト16 を、 =[サブフォーム表示コントロール名]!テキスト16 としてください。ここで[サブフォーム表示コントロール名]は メインフォームにおいてサブフォームを表示するコントロール名で、 初期値は「埋め込み0」のような名前になっています。 [サブフォーム表示コントロール名]が[サブフォーム名]として名前が 変更されていれば問題は無いと思いますが。」 のところに原因があるのかなと思うのですが、どうしても理解できません。 申し訳ありませんが、もう少し具体的に説明を頂けないでしょうか。 よろしくお願いいたします。

nodapapa
質問者

補足

回答頂きありがとうございました。 コントロールソースの記述で等号(=)を入れるとのご指摘ですが、 質問の記述での記入漏れで実際には等号(=)は入れています。 そこで、次にご説明を頂いた 「これで、データが表示されないようであれば、コントロールソースの =[Forms]![メインフォーム名]![サブフォーム名]!.Form!テキスト16 を、 =[サブフォーム表示コントロール名]!テキスト16 としてください。ここで[サブフォーム表示コントロール名]は メインフォームにおいてサブフォームを表示するコントロール名で、 初期値は「埋め込み0」のような名前になっています。 [サブフォーム表示コントロール名]が[サブフォーム名]として名前が 変更されていれば問題は無いと思いますが。」 のところに原因があるのかなと思うのですが、どうしても理解できません。 申し訳ありませんが、もう少し具体的に説明を頂けないでしょうか。 よろしくお願いいたします。

すると、全ての回答が全文表示されます。

関連するQ&A