- 締切済み
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'が見つかりません。
- みんなの回答 (17)
- 専門家の回答
みんなの回答
- chayamati
- ベストアンサー率41% (260/624)
どうやらお互いサブに拘ったのがいけなかったようですね 結論です 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)
追伸です 横文字は苦手ですが 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)
お忙しいですか 締め切りも迫っていますので、未完成ですがお伝えしたい事です。 前回利用者ごとのテーブルをサブテーブルとして、 サブフォームを持つフォームを提案しましたがしましたが 実行してみると、追加、削除が出来ません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)
- chayamati
- ベストアンサー率41% (260/624)
- chayamati
- ベストアンサー率41% (260/624)
- chayamati
- ベストアンサー率41% (260/624)
済みません。前回のは早とちりでした 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)
リレーション拝見しました 今回の課題はテーブルの設計で解決します。 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)
今回の課題はテーブルの設計でかいけつします。 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)
>リレーションの画像添付したいのですが、補足には画像添付できないんでしょうか? 管理者の方からお叱りを受けるかもしれませんが こちから「ACCESS VBAについて」の見出しで質問しました 参考URLへ画像を添付して回答下さい 質問No.9757235 に補足画像を付けて下さい
- 1
- 2