• ベストアンサー

サブフォームをブランクで開きたい(値の代入)

現在、サブフォームを開く時に値の代入の後、DMax関数で+1をして最後のレコードに+1したIDをマクロで行っていますが、VBAでできないでしょうか? 1.サブフォームを開く Cmd Open フォーム名 2.値の代入で(””)をいれフォームをクリア 3.値の代入でID=DMax"テーブル”+1 良い知恵があれば教えて頂けないでしょうか マクロにあまり頼りたくないので宜しくお願い致します。

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

  • ベストアンサー
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.6

確かに、多分うまくいっているとは思うけど 何となく一度確認してみたい、ということは あります。そこで、 >新規登録もそうですが、既存データの変更画面で変更 この後、何を確認すれば安心できますか? ということに、なります。普通はボタンで Private Sub 保存_Click() MsgBox "データを確定保存します" DoCmd.RunCommand acCmdSaveRecord End Sub のようにしておいて、データの入力が終わったら このボタンを押す、あるいはフォームを閉じるときに DoCmd.RunCommand acCmdSaveRecord を実行しておく、などでデータの保存をしておきます。 質問は、なおかつ安心のために >また立ち上げなおさなければデータが反映されたか分からない状態です。 >反映ボタンのような物を作りたいと思うのですが、 ということだろう、と思いますので、そこで再度、 「この後、何を確認すれば安心できますか?」 ということです。一番直接的なのはテーブルを立ち上げ、最終のレコードの 確認と、そのときフォームと同様にテーブルの左側に鉛筆マーク ではなく、黒い三角形になっていることを確認する、というような ことですが・・・・・、 「この後、何を確認すれば安心できますか?」

その他の回答 (5)

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.5

No4の追加で。 保存が確定していない状態でサブフォームを 開いても、レコードを移動させたりすると 自動的に保存が確定します。その点に ついては認識しておいてください。 なお、No4の >または、一応確定した状態でフォームを開く場合は、 >最初に書きましたようにデータの削除という方法を >とることになります。この場合は、 以降については、No4の前半の .Refresh を取り除かない状態のコード、すなわち No3の(1)のコードを使用した場合です。 ほかにも、いろいろな対応が考えられますが、それは 使用する中で、改善点が見つかったらでもいいと思いますが。

chi_ko6262
質問者

補足

色々な角度からのご助言、大変ありがとうございます。本当に勉強になります。 大変恐縮ですが、もう少しご助言いただきたいのですが、新規登録もそうですが、既存データの変更画面で変更しても終了してまた立ち上げなおさなければデータが反映されたか分からない状態です。反映ボタンのような物を作りたいと思うのですが、ご助言いただけないでしょうか。何卒、宜しくお願い致します。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.4

No2の(1)の場合、開くときにIDを設定する場合は、テーブル上では レコードの保存を確定させていますから、この場合は カレントレコードの削除で対応することになります。 もちろん、Dirtyの状態で開くことも出来ます。 その場合は、 Private Sub コマンド0_Click() DoCmd.OpenForm "サブフォーム名", acNormal With Forms!サブフォーム名 .SetFocus DoCmd.GoToRecord , , acNewRec .Controls("ID") = DMax("ID", "テーブル名") + 1 End With End Sub のようにします。この場合は、 .Refresh を除いています。これにより見た目はIDが登録され データも入力できますが、実はフォームの左側に 「鉛筆のマーク」が出ていると思います。この 状態のときはまだデータは確定保存されていません。 これを利用して、キャンセルするボタンを、 Private Sub キャンセル_Click() Me.Undo End Sub とします。これによりデータは確定保存されることなく テーブル上には痕跡は残りません。 ただし、キャンセルすることなくデータを入力して 保存する場合は、明確に保存することが肝要ですから、 保存ボタンを設定して、 Private Sub 保存_Click() MsgBox "データを確定保存します" DoCmd.RunCommand acCmdSaveRecord End Sub のようにしておきます。これを実行するとフォームの 左側の「鉛筆マーク」が黒い三角に変わり、表示 されているデータはテーブルに保存されていることに なります。 または、一応確定した状態でフォームを開く場合は、 最初に書きましたようにデータの削除という方法を とることになります。この場合は、 Private Sub 削除_Click() If MsgBox("登録したレコードを削除しますか", vbYesNo) = vbYes Then DoCmd.RunCommand acCmdDeleteRecord End If End Sub のようにします。このボタンはどのレコードにも 実行できますから、注意が必要です。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.3

No2です。 >DMax関数で+1 これは、新しいレコードを開き、そのときについでに 「ID」も+1しておく、ということであれば、以下のように してください。No2の(1)と(2)、それぞれについて以下のように。 なお、「テーブル名」の「ID」フィールドは数値型としています。 (1) Private Sub コマンド0_Click() DoCmd.OpenForm "サブフォーム名", acNormal With Forms!サブフォーム名 .SetFocus DoCmd.GoToRecord , , acNewRec .Controls("ID") = DMax("ID", "テーブル名") + 1 .Refresh End With End Sub (2) Private Sub コマンド0_Click() Me.埋め込み0.SetFocus DoCmd.GoToRecord , , acNewRec With Me.埋め込み0 .Controls("ID") = DMax("ID", "テーブル名") + 1 DoCmd.RunCommand acCmdSaveRecord .Requery End With End Sub

chi_ko6262
質問者

補足

(1)で私のしたいことができました。大変にありがとうございます。但し、キャンセルする為に キャンセルボタンをサブフォームに付けているのですが、今のままだとIDが残ってしまって ブランクのフィールドが出来てしまいます。色々していただいてありがたいのですが、その点も教えて頂ければ幸いです。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.2

>DMax関数で+1 ということは、新規レコードに移動するということでいいのでしょうか。 この「サブフォーム」というのが親フォームに埋め込まれた場合と、 単に他のフォームを立ち上げてそれを「サブフォーム」と称している 場合で、コードの書き方が少し違ってきますが。 (1) 他のフォーム(サブフォーム?)をボタンクリックで表示し、立ち上げたときに 新しいレコードに移動しておく。 Private Sub コマンド0_Click() DoCmd.OpenForm "サブフォーム名", acNormal With Forms!サブフォーム名 .SetFocus DoCmd.GoToRecord , , acNewRec End With End Sub (2) 親フォームに埋め込まれたサブフォームに対し、新規レコードに 移動する。 なお、コード中の「埋め込み0」というのはサブフォームを 表示するコントロール名で、初期値はこのような名前になっています。 実際に合わせて変更してください。 Private Sub コマンド0_Click() Me.埋め込み0.SetFocus DoCmd.GoToRecord , , acNewRec End Sub 勘違いしていなければ、ですが。 わからないところがあれば補足してください。

noname#206655
noname#206655
回答No.1

通常、フォームを作ると値もクリアされます。クリアしてもらっては困る場合、変数をグローバルに定義します。さらに、データベースを開きたいなら、1格上でOPENし、変数に入れます。 新規で1レコード追加したい場合で、既にOPENされているなら、Appendモードで開くんですが、フォームのテキストボックスは開いた時にクリアします。 だと、思った。 で、ご質問のサブフォームを開く時、seekで最後に持ってゆきます。 レコード5とレコード6の間を開ける・・・のは意味ないと思います。 CLOSEしないまでも、今のフォームで追加出来ます。 やりたいことは分かるんですが、無いです。あるとすれば、567849 と並んだデータベースを、複製ができますので 456789 にするのがあります。でも、あまり意味ないと思います。 何で並べ替えるか記載すれば、もっと的確な答えが得られそうです。

関連するQ&A