Microsoft Access 掲示板

サブフォームでのDlookup / 5

17 コメント
views
4 フォロー
5

>=[Forms]![基礎情報編集]![M_CMB]
>としたときは、正しい個人IDが表示されますか。

テキストボックスの値は真っ白でした・・・
全く値が取れていないようですね・・・。

これで、
フォーム名、コンボボックス名に間違いがないとすると、
外から原因を特定するのは難しそうです。

症状の再現できるなるべくシンプルなファイルを、右カラムのファイル送信フォームから送ってもらえませんか。
そうすれば、現物をみて原因を特定できるかもしれません。

通報 ...
  • 6
    ろでます 2020/07/07 (火) 20:05:03 61da2@be317 >> 5

    こんばんわ、ろでますです。
    お手数おかけしますm(_ _)m

    ファイルの方送付させていただきました・・・
    が、この掲示板ではどこでアップしたファイルがダウンロードできるようになっているのでしょう。
    手順を間違えたでしょうか(汗

  • 7

    送信ありがとうございました。
    ファイルは私のところにメールで届いています。
    自動でダウンロードできるようにはなってません。

    ファイルを見てみました。
    原因はメインフォームで個人IDを変更したときに、サブフォームで再クエリか再読み込みか再計算をしないと変更が反映されないようです。

    コンボボックス「M_CMB」の更新後処理のイベントプロシージャで再読み込みをしたらエラーなく表示されて、更新するとサブフォームの値も更新されました。

    Private Sub M_CMB_AfterUpdate()
        Me.個人別.Form.Refresh
    End Sub
    

    下記が修正済みのファイルです。

    ZIPファイル

    ただ、サブフォームが非連結(レコードソースが空欄)で、リンクフィールドが設定されていないために、自動で再読み込みが発生しないのが原因だと思われます。

    通常、サブフォームはテーブルかクエリに連結させて、リンクフィールドを設定すると思います。そうすれば、リンクフィールドを更新すればサブフォームも再読み込みされます。

    現状の非連結のサブフォームは、サブフォームにする必然性があるようには思えません。
    最終的にどのようなものを考えているのでしょうか。

  • 8
    ろでます 2020/07/07 (火) 21:05:58 61da2@be317 >> 5

    早々なご対応、誠にありがとうございます。
    一番の問題は私自身の知識不足です。

    エクセルからのAccessへの移行なので、その辺の知識が完全に欠落しております。

    「関数に間違いない変数を渡してるんだから、計算して当然」
    という思い込みがありました。

    私もレコードセットは疑って、色々試したんですが、とりあえず、クエリ1でいいのかなと思って当てたものの、うまくいかず(エラーのまま)、であれば、SQL分でSelect・・・で書いたものはどうか、と色々試しては見たんですが結果が同じでしたので、そのまま非連結の状態でお渡ししてしまったという経緯です。

    やはり、一番望ましいのは、

    >リンクフィールドが設定されていないために、自動で再読み込みが発生しないのが原因だと思われます。

    これを回避するために、リンクフィールドをきちんと設定してあげて、自動で再読み込みさせるのが理想です。

    もしよろしければ教えていただきたいのですが、このような場合、どのようなレコードソースを設定してあげるのがよろしいのでしょうか。

    ご教授いただけると助かります。

  • 9
    ろでます 2020/07/07 (火) 21:13:23 61da2@be317 >> 5

    ちなみに、とりあえずの最終形態として考えているは、
    個人別サブフォームを帳票フォームにして、
    M_CMBを1に切り替えると、
    Aさん ○○障害
    Aさん ××障害
    Aさん △△障害

    そして、2に切り替えると、帳票フィールドの行数も動的に変化し
    Bさん ××障害
    Bさん △△障害

    といった形に持って行きたいと思っています。
    今は。帳票フォームの行が全部AさんやBさんになっているので、そこからまた頭を使って考えなければなりません(^^;

  • 10
    ろでます 2020/07/07 (火) 22:37:00 61da2@be317 >> 5

    たびたびすいません、もう一点。
    レコードソースについてなのですが、少し他の人に以前教えていただいたところ、VBAの中で

    Private Sub M_CMB_AfterUpdate()
       [Forms]![基礎情報編集]![M-CMB].Requery
       sqlstr="SELECT * " &・・・
       Me.F_個人別.Form.RecordSource = sqlStr
       Me.F_個人別.Form.Requery
    end sub

    で、サブフォームのレコードセットは適当でも、これで書き換わるからいいと教えられました。
    確かにこれでサブフォームのレコードセットは書き換わってうまく動作はするのですが・・・

    だったら、最初からマクロに書かないで、レコードセットの所に直接書けば動くのでは?、と思い書くと動きませんでした。

    こういう場合、このようなやり方は一般的なのでしょうか?

    後からこのDBのフォームを見た人は、レコードセットがないと勘違いしてしまいそうで怖いです。

  • 11
    hiroton 2020/07/08 (水) 09:02:11 600c4@f966d >> 5

    で、サブフォームのレコードセットは適当でも、これで書き換わるからいいと教えられました。

    ACCESSを扱うなら非常に行儀が悪いですね。危惧している通りいろいろ問題が起きます。

    まずはしっかりACCESSの作法を覚えるべきで、応用はその上に成り立つものでしょう


    今は。帳票フォームの行が全部AさんやBさんになっているので、そこからまた頭を使って考えなければなりません(^^;

    フォーム(サブフォーム)に必要とするすべてのデータを表示することができたら、フィルタープロパティを使ってデータの絞り込みができます。
    サブフォームにはレコードソースを設定しておいて、親フォームのM_CMBの更新後イベントを次のようにします

    Private Sub M_CMB_AfterUpdate()
        Dim strFilter
        If Not IsNull(Me!M_CMB) Then
            strFilter = "個人ID=" & Me!M_CMB
        End If
        Me!F_個人別.Form.Filter = strFilter
        Me!F_個人別.Form.FilterOn = True
    End Sub