やりたい事は、
ポイント
サブフォームのボタンをクリックしたら、サブフォーム上のNOにより抽出されたデータをレコードソースとして別フォームをオープンさせたい
簡単そうで時間がかかったので備忘録にしたいと思います。
サブフォーム内のNOを変数設定
まず、サブフォーム内のボタンをクリックした時に、「NO」を変数に代入するようにしました。
変数は、VBAプロシージャをまたがっても保持し続けるようにグローバル変数にしました。
そして、NOでクエリーをフォームのレコードセットにした状態でオープンすると思ったようなデータが抽出されませんでした。
そこで、フォームを開く時に抽出したレコードセットを設定するようにしました。
Private Sub Form_Load() ' Dim cn As ADODB.Connection ' Dim rs As ADODB.Recordset On Error GoTo Err_Handler Debug.Print hensuu Me.RecordSource = "Select * Document Where NO = " & hensuu ' Set cn = CurrentProject.AccessConnection ' Set rs = New ADODB.Recordset ' With rs ' Set .ActiveConnection = cn ' .Source = "SELECT * FROM Document WHERE NO =5" ' .LockType = adLockOptimistic ' .CursorType = adOpenKeyset ' .Open ' End With ' ' ' ' ' Set Me.Recordset = rs ' rs.Close: Set rs = Nothing ' cn.Close: Set cn = Nothing ExitErr_Handler: Exit Sub Err_Handler: MsgBox "エラー: " & Err.Description ' rs.Close: Set rs = Nothing ' cn.Close: Set cn = Nothing End Sub
ちゃんと変数「Debug.Print hensuu」には、整数が設定されており問題無いはずです。
ここから中々抜け出せませんでした。整数じゃなくテキストに変更して見たりしましたが視点が違うようです。
神経質かよ!?
原因は、フィールド指定のようです。
Me.RecordSource = "Select * Document Where NO = " & hensuu
これじゃダメ!
Me.RecordSource = "SELECT * FROM Document WHERE Document.[NO] = " & hensuu
ココに注意
フィールド指定が【テーブル名.[フィールド名]】に変更
サブフォームに限っての仕様なのかは分かりませんが、「テーブル名ドットフィールド名」というようにしないと抽出されませんでした。
開いたフォームのサブフォームにレコードソース設定
親フォームのサブフォームの「詳細入力」ボタンをクリックすると、「NO」で抽出されたレコードをレコードソースとするフォームが開きます。
そうしたら、そのフォームのサブフォームにも「NO」で抽出されたレコードソースを設定する方法ですが、
ココがポイント
Forms![親フォーム名]![サブフォーム名].Form.RecordSource = SQL
でいいようです。
本当にちょっとの事でAccessは思ったような動きをしてくれないので困ります。
見積請求システムとするなら、「会社名フォーム(見積請求件名一覧)」があり、見積請求件名一覧から、詳細入力ボタンを押すことで、その件名に対する詳細項目を入れていくという仕様になります。
普通ならクエリーをレコードソースにしたりVBAを使わずともできるように思えますが、なぜかうまく動かなかったのでVBAでやりました。