• 締切済み

ACCESS VBAについて

accessフォームにて実験データを入力するシステムを考えています。 添付画像のように空白のフォームに3つのサブフォーム(A.B.C)を設置しています。 動きとしては空白フォームに非連結のテキストボックス(日付カレンダー)があり、日付を変えるとフォームAのリストがその日付のサンプルリストが抽出されます。 次にフォームAの帳票リストのレコード選択するとそのレコードのSampleIDを参照してフォームBおよびフォームCのリクエリをかけたいのですがフォームBは連動するのですがフォームCが連動しません。 vbaは独学でしており、コードもネットからコピペばかりです(汗) エラーが出て、どう対処していいのかわかりません、 ご教授お願いいたします。 参考コード フォームAのレコードが選択(更新)する際のイベントです。 Private Sub Form_Current() SampleIDtemp = Me.TextSampleID.Value On Error GoTo KAIHI1 Forms(Screen.ActiveForm.Name).Controls("B").Form.RecordSource = "SELECT * FROM B WHERE B.SampleID = " & SampleIDtemp & ";" Forms(Screen.ActiveForm.Name).Controls("B").Form.Requery KAIHI1: On Error GoTo KAIHI2 Forms(Screen.ActiveForm.Name).Controls("C").Form.RecordSource = "SELECT * FROM C WHERE C.SampleID = " & SampleIDtemp & ";" Forms(Screen.ActiveForm.Name).Controls("C").Form.Requery KAIHI2: End Sub ちなみにいくつか出たエラーを示します (1)実行時エラー'2475': 指定した式では、フォームがアクティブウィンドウである必要があります。 (2)実行時エラー'2450': 参照されているフォーム'A'が見つかりません。

みんなの回答

  • chayamati
  • ベストアンサー率41% (260/624)
回答No.17

どうやらお互いサブに拘ったのがいけなかったようですね 結論です T_InjectionInfoとT_ScanInfoを  ナビゲーション内でコピペしてT_InjectionとT_Scan作成 T_PatientInfoとT_Injection及びT_ScanにOrder_IDで参照整合性のリレーションを設定 添付のようなクエリを作成  フィールドへは各テーブルのワイルドカード[*]をドラッグ  年齢計算の式をフィールドへ追記   年齢: DateDiff("yyyy",[P_BIRTH],[Exam_Date]) デザインビューで必要な項目を配置  既存のフィールドツールより項目をドラッグ 以下VBAをコピペ -------------------------------------------------------------------------------- Option Compare Database Option Explicit Private Sub Form_Load() ScreenRTN End Sub Private Sub ScreenRTN() DoCmd.SetWarnings False DoCmd.RunSQL ("DELETE from T_Injection") DoCmd.RunSQL ("DELETE from T_Scan") DoCmd.SetWarnings True DoCmd.RunSQL ("INSERT into T_Injection(Order_ID,薬剤名,注入濃度,注入速度,注入時間,注入量,減量指示) " _ & "select Order_ID,薬剤名,注入濃度,注入速度,注入時間,注入量,減量指示 from T_InjectionInfo ; ") DoCmd.RunSQL ("INSERT into T_Scan(Order_ID,Series_No,Scan_Type,Scan_部位,Scan_Timing,Scan_result) " _ & "select Order_ID,Series_No,Scan_Type,Scan_部位,Scan_Timing,Scan_result from T_ScanInfo ;") DoCmd.SetWarnings True End Sub ----------------------------------------------------------------------------------------------------

  • chayamati
  • ベストアンサー率41% (260/624)
回答No.16

追伸です 横文字は苦手ですが T_PatientInfoの中のP_AGEは年齢ですね。  年齢:DATEDIFF("yyyy",startdate,enddate)をクエリのフィールドに記述   ATEDIFF("yyyy",P_BIRTH,Exam_Date) T_PatientInfoの中のP_ID P_NAME P_SEX P_BIRTHは固定的な情報ですね  M_Name( ID P_NAME P_SEX P_BIRTH)のテーブル追加     IDはオートナンバー型の主キー     P_SEXにルックアップ設定 添付図参照  T_PatientInfoからP_NAME P_SEX P_BIRTH を除去   テーブルデザインのP_IDに三番目のルックアップタグでM_Nameを参照   ルックアップタグは始めテキストなっているがこれの右端クイックから    コンポボックスに変更  

  • chayamati
  • ベストアンサー率41% (260/624)
回答No.15

お忙しいですか 締め切りも迫っていますので、未完成ですがお伝えしたい事です。 前回利用者ごとのテーブルをサブテーブルとして、 サブフォームを持つフォームを提案しましたがしましたが 実行してみると、追加、削除が出来ませんAでOrderIDを追加出来ない 1.T_PatienInfo,T_InjectioInfo,T_ScanInfoの構造のみコピペして 2.空のテーブルT_Patien,T_Injection,T_Scanに  それぞれにオートナンバー型のフィールドを主キーとて追加する  こちらのにはOrder_IDには重複なしの定義が可能です  こちらにリレーション設定を定義して そこで考えたのがBCのフィールドをAに配置して、一つのテーブルとし Aの情報を最新のBCの情報で更新(Update)するのが 下記の命令文です。AのフォームのVBAにコピペして下さい --------------------------------------------------------------------------------------- Option Compare Database Option Explicit Private Sub Form_Load() ScreenRTN UpdateRTN End Sub Private Sub ScreenRTN() DoCmd.SetWarnings False DoCmd.RunSQL ("DELETE from T_Injection") DoCmd.RunSQL ("DELETE from T_Scan") DoCmd.SetWarnings True DoCmd.RunSQL ("INSERT into T_Injection(Order_ID,薬剤名,注入濃度,注入速度,注入時間,注入量,減量指示) " _ & "select Order_ID,薬剤名,注入濃度,注入速度,注入時間,注入量,減量指示 from T_InjectionInfo ; ") DoCmd.RunSQL ("INSERT into T_Scan(Order_ID,Series_No,Scan_Type,Scan_部位,Scan_Timing,Scan_result) " _ & "select Order_ID,Series_No,Scan_Type,Scan_部位,Scan_Timing,Scan_result from T_ScanInfo ;") DoCmd.SetWarnings True End Sub Private Sub UpdateRTN() DoCmd.SetWarnings False DoCmd.RunSQL ("update T_PatientInfo inner join T_Scan on T_PatientInfo.Order_ID =T_Scan.Order_ID " _ & " set T_PatientInfo.Scan_Type =T_Scan.Scan_Type,T_PatientInfo.Scan_部位 =T_Scan.Scan_部位 " _ & " ,T_PatientInfo.Scan_Timing=T_Scan.Scan_Timing, T_PatientInfo.Scan_result=T_Scan.Scan_result ; ") DoCmd.RunSQL ("update T_PatientInfo inner join T_Injection on T_PatientInfo.Order_ID =T_Injection.Order_ID " _ & " set T_PatientInfo.薬剤名 =T_Injection.薬剤名, T_PatientInfo.注入濃度=T_Injection.注入濃度 " _ & " , T_PatientInfo.注入速度 =T_Injection.注入速度,T_PatientInfo.注入時間=T_Injection.注入時間 " _ & " , T_PatientInfo.注入量 =T_Injection.注入量 , T_PatientInfo.減量指示=T_Injection.減量指示 ; ") DoCmd.SetWarnings True ' DoCmd.RunSQL ("update T_PatientInfo inner join T_InjectionInfo on T_PatientInfo.Order_ID =T_InjectionInfo.Order_ID " _ ' & " set T_PatientInfo.薬剤名 =T_InjectionInfo.薬剤名, T_PatientInfo.注入濃度=T_InjectionInfo.注入濃度 " _ ' & " , T_PatientInfo.注入速度 =T_InjectionInfo.注入速度,T_PatientInfo.注入時間=T_InjectionInfo.注入時間 " _ ' & " , T_PatientInfo.注入量 =T_InjectionInfo.注入量 , T_PatientInfo.減量指示=T_InjectionInfo.減量指示 ; ") End Sub

  • chayamati
  • ベストアンサー率41% (260/624)
回答No.14

如何ですか?実はこちらもうまく行かず リレーションシップを見直し、今は添付のようになっています。 ・3つのテーブルにオートナンバー型のIDを追加 ・各テーブルのSampleID を重複なし ・SampleID 間での参照整合性リレーション出来ないので  リレーション線を右クイック→種類の変更→Aの全てB、Aの全てとC  

  • chayamati
  • ベストアンサー率41% (260/624)
回答No.13

回答No.12の続きです フォームを開いてあなたの質問文をコピペした画像を添付します。

  • chayamati
  • ベストアンサー率41% (260/624)
回答No.12

回答No.11でしきりと「形を整えて」と記述しましたが結果を最終のサブフォームを持つフォームのデザインビューを添付します Commentはデータ型を「コメント」または「長いテキスト」にすると改行可能なボックスになります。 このボックスをサブフォームの横に配置しました。

  • chayamati
  • ベストアンサー率41% (260/624)
回答No.11

済みません。前回のは早とちりでした T_scaninfoとT_InjectionfoはT_PatientInfoのサブテーブルです。 T_scaninfoとT_Injectionfoの OrderIDを主キーにして データ型を数値型にして ※主キーに出来なければ重複データが存在するためです。これを解消して下さい フォームの作成手順  3つのテーブルをレコードソースとして最後にサブフォームを持つフォームとして仕上げます 1.T_Scaninfoを開く→作成リボン→フォーム  →フォームが表示されるのでデザインビューに切り替えて形を整えて閉じる  →フォーム名入力枠に「B」と入力 2.T_InjectioInfoを開く→作成リボン→フォーム  →フォームが表示されるのでデザインビューに切り替えて形を整えて閉じる  →フォーム名入力枠に「C」と入力 3.T_PatientInfoを開く→作成リボン→その他のフォーム→複数のアイテム  帳票形式のフォームが表示されるのでデザインビューに切り替え  →ナヴィゲーションウィンドウよりBをフォームフッターにドラッグ  →警告にはい→Cをドラッグフォームフッターにドラッグ  →プロパティ―シートの書式タグの既定のビューを帳票に切り替え  →形を整えて閉じる→フォーム名入力枠に「A」と入力

  • chayamati
  • ベストアンサー率41% (260/624)
回答No.10

リレーション拝見しました 今回の課題はテーブルの設計で解決します。 T_scanInfoをM_scanInfoとして  OrderIDを削除  ID 主キー オートナンバー型 追加 T_injectionInfoをM_injectionInfo  OrderIDを削除  ID 主キー オートナンバー型 追加 T_patentinfoに次のフィールドを追加  scanInfoID 長整数型、T_scanInfoをルックアップ  injectionInfoID 長整数型型、T_scanInfoをルックアップ ※ルックアップの表示項目はに重複なしにします。おそらくSerise_No,薬剤名  それぞれのフォーム3つで如何ですか

  • chayamati
  • ベストアンサー率41% (260/624)
回答No.9

今回の課題はテーブルの設計でかいけつします。 T_scanInfoをM_scanInfoとして  OrderIDを削除  ID 主キー オートナンバー型 追加 T_injectionInfoをM_injectionInfo  OrderIDを削除  ID 主キー オートナンバー型 追加 T_patentinfoに次のフィールドを追加  scanInfoID 長整数型、T_scanInfoをルックアップ  injectionInfoID 長整数型型、T_scanInfoをルックアップ ※ルックアップの表示項目はに重複なしにします。おそらくSerise_No,薬剤名  それぞれのフォーム3つで如何ですか

  • chayamati
  • ベストアンサー率41% (260/624)
回答No.8

>リレーションの画像添付したいのですが、補足には画像添付できないんでしょうか?  管理者の方からお叱りを受けるかもしれませんが  こちから「ACCESS VBAについて」の見出しで質問しました  参考URLへ画像を添付して回答下さい 質問No.9757235 に補足画像を付けて下さい

参考URL:
https://okwave.jp/qa/q9757850.html

関連するQ&A

専門家に質問してみよう