ACCESSで開発しています
OS:Windows10
開発:Office365 Access
単票フォームにコンボボックスを2つ、
サブフォームを1つ、コマンドボタン1つを置いています。
コンボボックスのリストには
それぞれ顧客名と物件名が入っています。
コンボボックスのリストから選択すると、
それぞれのIDがコンボボックスのラベルに表示されます。
コマンドボタンを押したときに、
コンボボックスのIDを条件に、
サブフォームに一覧を表示しようとしています。
コードは以下の通りです。
Private Sub コマンド6_Click()
Dim strsql As String
Dim strWHsql As String
Dim objRS As Object
Dim strKokyaku As String
Dim strBuken As String
`
コンボボックスのラベルにあるIDを変数に格納
strKokyaku = Trim(lblKokyaku.Caption & "")
strBuken = Trim(lblBuken.Caption & "")
`
`
SQL作成
strsql = "select *"
strsql = strsql & " from M_顧客"
strsql = strsql & " inner join"
strsql = strsql & " M_物件 "
strsql = strsql & " on M_顧客.ID = M_物件.顧客ID"
If strKokyaku <> "" Then
strWHsql = " where"
strWHsql = strWHsql & " M_顧客.ID = '" & strKokyaku & "'"
End If
If strBuken <> "" Then
If strKokyaku = "" Then
strWHsql = " where"
Else
strWHsql = strWHsql & " AND"
End If
strWHsql = strWHsql & " M_物件.ID = '" & strBuken & "'"
End If
If strWHsql <> "" Then
strsql = strsql & strWHsql
End If
`
`
レコードセットを開く
Set objRS = CurrentDb.OpenRecordset(strsql)
`
`
サブフォームにデータをセット
Me!sfDetail.Form.RecordSource = strsql
Set Me!sfDetail.Form.Recordset = objRS
`
End Sub
Set objRS = CurrentDb.OpenRecordset(strsql)の所ではエラーは出ません。
ブレークポイントを置いて、イミディエイトウインドで確認しても
?objRS.EOF → Falseが返ってきますし、
?objRS![M_物件.顧客ID] → 00002の様に、正しい値が返ってきます。
しかし、Me!sfDetail.Form.RecordSource = strsqlでも
Set Me!sfDetail.Form.Recordset = objRSでも
実行時エラー2467 指定した式で、閉じているか存在しないオブジェクトを参照しています
というエラーが出ます。
どなたか解決方法をご存じの方、
ご享受していただけないでしょうか。
よろしくお願いいたします。
ます、サブフォームにデータを表示するなら、RecordSourceプロパティに SQLを設定するだけでOKです。
OpenRecordsetでレコードセットを開く必要も、Recordsetプロパティにレコードセットを代入する必要もありません。
Me!sfDetail.Form.RecordSource = strsql
のところで「閉じているか存在しないオブジェクトを参照しています」のエラーが出るのでしょうか。だとしたら、sfDetail がサブフォームコントロール名でないのが原因かと思われます。
サブフォーム名ではなくサブフォームコントロール名になってますか。下記参照
返答が遅くなり大変申し訳ございません。
原因は、サブフォームのソースオブジェクトが空だったことと思われます。
クエリを作成しておいて、サブフォームのソースオブジェクトプロパティに
そのクエリを入れてから、RecordSourceにSQL文を入れることで解決出来ました。
ご回答いただき、大変助かりました。
本当にありがとうございました。