電子書籍の厳選無料作品が豊富!

フォームを閉じるときに表示していたレコードを次回開くときにも表示させたいのです。
データにはIDをふっているのですが、レコードの番号と同じではなく、フォームを閉じるときにIDを記録するテーブルを作成して次回オープン時に呼び出そうとしたのですが、GoToRecord を使うのではうまくいかないでしょうか?

フォームを閉じるときは下のように作りました

Private Sub Form_Close()
Dim cat As ADOX.Catalog
Dim tb As ADOX.Table

Set cat = New ADOX.Catalog
cat.ActiveConnection = CurrentProject.Connection

Set tb = New ADOX.Table
tb.Name = "T最終閲覧"
tb.Columns.Append "ID", adInteger

cat.Tables.Append tb

Set cat = Nothing

ここに
    .AddNew

![ID] = [Forms]![フォーム名]![ID]

.Update
としています。
このデータをオープン時に生かすことができず、詰まっています
レコード番号自体を記録することがきるかもわからず、どんどん後回しになってしまって何時まで経っても完成しません。
何かヒントでも構いませんのでご教授いただければと思います。

A 回答 (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
他のフォームでもやりたくなった場合を想定してしまったが、余計なお世話かも。
・・・その場合、もっと洗練されたようにも出来ますが、
これは後々の課題ということで、さいなら~ (^_^)/~
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/03/18 17:51

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

補足、このメニューフォームをファイルを開いたときに表示し、ここから他のフォーム、レポートを開くようにしています。
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/03/18 17:53

たとえば


フォームのOPEN時イベントに
Me.Recordset.FindFirst "ID = 5"
とすれば、そこに移動します。
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/03/18 17:11

IDが保存されているなら。


フォームのrecordsourceをSQLで検索した結果にすれば良いと思う。
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/03/18 17:10

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報