• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:access 最終閲覧レコードを開く)

フォームを閉じるときに最終閲覧レコードを次回開く方法について

このQ&Aのポイント
  • フォームを閉じる際に最終閲覧レコードを記録するテーブルを作成し、次回オープン時に呼び出す方法を検討しています。
  • 現在、GoToRecordを使用しているがうまく動作していないため、他の方法を探しています。
  • レコード番号自体を記録する方法も試していますが、まだ解決に至っていません。

質問者が選んだベストアンサー

  • ベストアンサー
  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.4

Docmd.gotorecord の Offset で指定するのは、マズイ気がします。 1・フォームでフィルターを掛けたまま閉じた場合、 (フォームのデザインで『読み込み時にフィルターを適用』になっていれば良いかな?) 2・テーブルやクエリで色々と変更した場合 3・IDが連番で無くて欠番が有った場合 など。 決して自説を押しつけるわけではありませんが、一応考えたのを。 以下を標準モジュールに(テーブルが無い場合には作成されるように) Function chkTable() Dim catADOX As ADOX.Catalog Dim Tbl As ADOX.Table Set catADOX = New ADOX.Catalog catADOX.ActiveConnection = CurrentProject.Connection For Each Tbl In catADOX.Tables If Tbl.Name = "T最終閲覧" Then Set catADX = Nothing Exit Function End If Next Set Tbl = New ADOX.Table Tbl.Name = "T最終閲覧" With Tbl.Columns .Append "IDNo", adInteger '長整数型 .Append "FormName", adVarWChar, 10 'フォーム名長10文字 End With catADOX.Tables.Append Tbl Set Tbl = Nothing Set catADX = Nothing End Function フォームの、Open時イベントに Dim recID As Long Call chkTable recID = Nz(DLookup("IDNo", "T最終閲覧", "formName = '" & Me.Name & "'"), 0) If recID = 0 Then MsgBox "前回のレコード位置を特定できませんでした。" End If Me.Recordset.FindFirst "ID =" & recID フォームの、UnLoad時イベントには Dim sSQL As String Call chkTable 'うっかり野郎対策でこっちにも If DCount("*", "T最終閲覧", "formName = '" & Me.Name & "'") = 0 Then sSQL = "INSERT INTO T最終閲覧 (IDNo,formName) VALUES(" & Me!ID & ",'" & Me.Name & "')" CurrentDb.Execute (sSQL) Else sSQL = "UPDATE T最終閲覧 SET IDNo =" & Me!ID & ", FormName = '" & Me.Name & "'" CurrentDb.Execute (sSQL) End If 以下、蛇足気味ですが Function chkTable() をいつ呼び出すか・・ フォームのOpen/UnLoad時イベントでも良いのですが テーブルを消してしまう私のようなうっかり野郎でなければ マクロで プロシージャの実行 プロシージャ名 chkTable() マクロ名を、autoexec で保存。 としても良さそうです。この場合は、MDB?ACCDB?が開かれる都度実行されます。 蛇足2 他のフォームでもやりたくなった場合を想定してしまったが、余計なお世話かも。 ・・・その場合、もっと洗練されたようにも出来ますが、 これは後々の課題ということで、さいなら~ (^_^)/~

sliontec
質問者

お礼

出来ました!ありがとうございます。 標準モジュールの使い方がいまいちだったのが理解することができました。 まだまだ勉強します。ありがとうございました。

その他の回答 (3)

  • chayamati
  • ベストアンサー率41% (260/624)
回答No.3

GoToRecordで出来ます。 ただしフォームを開く前に最終閲覧レコードNo.が確定している事が前提です。 そのためにちょっとした仕掛けをします。 1.プロフィールというテーブル作成します。  このテーブルには例えば企業であれば企業名、決算期、消費税率等  企業の基本になるフィールドを定義します。  この中に最終閲覧No.も定義しておきます。 2.「メニュー」というフォームを作成し、1.のプロフィールレコードソースとします。  最終閲覧No.のテキストボックスの可視をいいえにしても有効です。 3.フォームに次の命令文を追加します  Private Sub Form_Activate() DoCmd.GoToRecord , , acGoTo, Forms!メニュー!最終閲覧No.  End Sub  Private Sub Form_Current() Forms!メニュー!最終閲覧No. = CurrentRecord  End Sub 補足、このメニューフォームをファイルを開いたときに表示し、ここから他のフォーム、レポートを開くようにしています。

sliontec
質問者

お礼

フォームとテーブルを使うとは、勉強になります。一見簡単そうですがなかなか自分の頭から作り出すことができず苦労します。ありがとうございました。

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.2

たとえば フォームのOPEN時イベントに Me.Recordset.FindFirst "ID = 5" とすれば、そこに移動します。

sliontec
質問者

お礼

IDが変数として代入できるのかどうかもわからなかったので質問しました。まだまだ勉強が必要のようです。ありがとうございました。

  • masatsan
  • ベストアンサー率15% (179/1159)
回答No.1

IDが保存されているなら。 フォームのrecordsourceをSQLで検索した結果にすれば良いと思う。

sliontec
質問者

お礼

ありがとうございます。SQLは抽出しか考えていなかったので、レコードソースを検索できるとは思っていませんでした。

関連するQ&A