こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

現在、サブフォームを開く時に値の代入の後、DMax関数で+1をして最後のレコードに+1したIDをマクロで行っていますが、VBAでできないでしょうか?

1.サブフォームを開く Cmd Open フォーム名
2.値の代入で(””)をいれフォームをクリア
3.値の代入でID=DMax"テーブル”+1

良い知恵があれば教えて頂けないでしょうか
マクロにあまり頼りたくないので宜しくお願い致します。

投稿日時 - 2015-04-02 13:18:53

QNo.8947711

すぐに回答ほしいです

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

確かに、多分うまくいっているとは思うけど
何となく一度確認してみたい、ということは
あります。そこで、


>新規登録もそうですが、既存データの変更画面で変更

この後、何を確認すれば安心できますか?


ということに、なります。普通はボタンで

Private Sub 保存_Click()
MsgBox "データを確定保存します"
DoCmd.RunCommand acCmdSaveRecord
End Sub

のようにしておいて、データの入力が終わったら
このボタンを押す、あるいはフォームを閉じるときに
DoCmd.RunCommand acCmdSaveRecord
を実行しておく、などでデータの保存をしておきます。
質問は、なおかつ安心のために

>また立ち上げなおさなければデータが反映されたか分からない状態です。
>反映ボタンのような物を作りたいと思うのですが、
ということだろう、と思いますので、そこで再度、

「この後、何を確認すれば安心できますか?」

ということです。一番直接的なのはテーブルを立ち上げ、最終のレコードの
確認と、そのときフォームと同様にテーブルの左側に鉛筆マーク
ではなく、黒い三角形になっていることを確認する、というような
ことですが・・・・・、

「この後、何を確認すれば安心できますか?」

投稿日時 - 2015-04-03 12:00:01

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.5

No4の追加で。
保存が確定していない状態でサブフォームを
開いても、レコードを移動させたりすると
自動的に保存が確定します。その点に
ついては認識しておいてください。


なお、No4の

>または、一応確定した状態でフォームを開く場合は、
>最初に書きましたようにデータの削除という方法を
>とることになります。この場合は、

以降については、No4の前半の
.Refresh
を取り除かない状態のコード、すなわち
No3の(1)のコードを使用した場合です。



ほかにも、いろいろな対応が考えられますが、それは
使用する中で、改善点が見つかったらでもいいと思いますが。

投稿日時 - 2015-04-02 18:59:39

補足

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

投稿日時 - 2015-04-03 10:17:48

ANo.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

のようにします。このボタンはどのレコードにも
実行できますから、注意が必要です。

投稿日時 - 2015-04-02 18:45:18

ANo.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

投稿日時 - 2015-04-02 15:17:03

補足

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

投稿日時 - 2015-04-02 17:20:53

ANo.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


勘違いしていなければ、ですが。
わからないところがあれば補足してください。

投稿日時 - 2015-04-02 14:26:35

通常、フォームを作ると値もクリアされます。クリアしてもらっては困る場合、変数をグローバルに定義します。さらに、データベースを開きたいなら、1格上でOPENし、変数に入れます。

新規で1レコード追加したい場合で、既にOPENされているなら、Appendモードで開くんですが、フォームのテキストボックスは開いた時にクリアします。

だと、思った。

で、ご質問のサブフォームを開く時、seekで最後に持ってゆきます。

レコード5とレコード6の間を開ける・・・のは意味ないと思います。

CLOSEしないまでも、今のフォームで追加出来ます。

やりたいことは分かるんですが、無いです。あるとすれば、567849 と並んだデータベースを、複製ができますので 456789 にするのがあります。でも、あまり意味ないと思います。

何で並べ替えるか記載すれば、もっと的確な答えが得られそうです。

投稿日時 - 2015-04-02 13:41:03

あなたにオススメの質問