この質問が 2 年前のものであることは承知していますが、つまずいてアクセス サブフォーム コントロールに SQL クエリを使用したいと考えている私たちにとっては (多くの SQL クエリ/ストアド プロシージャは複雑すぎてフォーム レコード ソースに入れることができません)。 ...ADO がうまく機能することがわかりました。適切な説明については、http://support.microsoft.com/kb/281998/EN-US/を参照してください。これをサブフォームで機能させるために、フォームではなく、サブフォームの「オープン時」イベントにコードを配置しました。
1 つの注意点は、サブフォームがメイン フォームにバインドされない (親/子が失われる) ため、他のコードに頼って新しいレコードを追加する必要があることです。私の特定のサブフォームは読み取り専用であるため、親/子である必要はありません。親/子効果を再作成するためにストアド プロシージャを呼び出すときに、メイン フォームのレコード ID をパラメーターとして使用します (私の例については以下のコードを参照してください)。 )。
また、LockType adLockPessimistic または adLockOptimisic を指定しない場合、このコードは機能しません。adLockReadOnly は機能しません (メモリ内、スタンドアロン、切断された ADO レコードセットを参照してください)。「オブジェクトは有効な Recordset プロパティではありません」というエラーが表示され、少し頭痛の種になる可能性があります。:)
私のコード例 ( https://accessexperts.com/blog/2011/01/21/easy-adodb-recordsets-and-commands-in-access/の Juan Soto のユニバーサル ADO 接続の例を使用します):
Private Sub Form_Open(Cancel As Integer)
On Error GoTo ErrHandler
Dim rs As ADODB.Recordset
Dim strSQL As String
Dim strPoint As String
'I use my Point_ID from my main form as a parameter to fill the subform to recreate the "parent/child" effect
strPoint = Forms!FRM_Vegetation_Strata!Point_ID
strSQL = "sp_Report_VegWorksheet '" & strPoint & "'"
'this method of calling the sub "OpenMyRecordset" is from Soto's example listed above
OpenMyRecordset rs, strSQL, rrOpenStatic, rrLockOptimistic, True
With rs
If .RecordCount = 0 Then
MsgBox "No records returned"
End If
End With
Set Me.Recordset = rs
ExitProcedure:
On Error Resume Next
Exit Sub
ErrHandler:
MsgBox Err.Description & " (" & Err.Number & ") encountered", vbOKOnly + vbCritical, "InitConnect"
Resume ExitProcedure
Resume
End Sub
メイン フォームのデータが変更されたときにサブフォームを更新するには:
Private Sub cmdRefresh_Click()
Me.Form.Recordset.Requery
Set Me.Form.Recordset = Me.Form.Recordset
End Sub
フォームが閉じたとき (サブフォームの「on close」イベントで)
Private Sub Form_Unload(Cancel As Integer)
'Close the ADO connection we opened
On Error Resume Next
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Set cn = Me.Recordset.ActiveConnection
If cn.State = adStateOpen Then
cn.Close
End If
Set cn = Nothing
Set rs = Nothing
Set Me.Recordset = Nothing
End Sub