• ベストアンサー

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

現在、サブフォームを開く時に値の代入の後、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

  • アクセス2003のサブフォームの値の代入

    アクセス2003でメインフォームにデータシートビューのサブフォームを作成しています。 そのサブフォームのフィールドにイベントで検索用の別のフォームを開くようにしています。 検索用フォームからサブフォームへマクロで値を代入するように しているのですが、サブフォームが見つからないというエラーが表示されます。 どこに問題があるのでしょうか? (ちなみにサブフォームだけ開いて検索フォームを開き値を代入するとうまく行きます。メインフォームからだとエラーになります。) どうぞよろしくお願いします。

  • サブフォームに変数を代入し、RecordSourceの値を取得したい

    サブフォームに変数を代入し、RecordSourceの値を取得したいのですがうまくいきません。 Sub test1() Dim サブフォーム As String Dim フォーム As String フォーム= "土台" サブフォーム = "フォーム1" MsgBox Form_フォーム1.RecordSource End Sub ******************************************************************* Sub test2() Dim サブフォーム As String Dim フォーム As String フォーム= "土台" サブフォーム = "フォーム1" MsgBox Form_フォーム1.RecordSource MsgBox Forms(フォーム).Controls(サブフォーム).RecordSource End Sub オブジェクトは、このプロパティまたはメソッドをサポートしていません。(Error 438) ******************************************************************* Sub test3() Dim サブフォーム As String Dim フォーム As String フォーム = "土台" サブフォーム = "フォーム1" MsgBox Forms(サブフォーム).RecordSource End Sub 実行時エラー'2450' マクロの式またはVisual Basic コート゛で参照されている 'フォーム名'フォームが見つかりません。 ******************************************************************* test1~3のうち test1のみはうまくいくのですが 変数を代入したいです。 ヘルフ゜のには Forms![受注]![受注サブフォーム].Formとなってますが これじゃ変数を代入できないですよね。 どうすればサブフォームに変数を代入しつつ、RecordSourceの値を取得できるのでしょうか? よろしくお願いします。

  • アクセス サブフォームのレコードの値が変更したら

    フォームの中にテーブルに基づいたサブフォームを入れています。 サブフォームはデータシートビューで表示しています。 そのサブフォームのレコードの値が変わったら msgboxを表示させるにはどのイベントで行なえば良いですか? サーブフォームのコントロールに Private Sub ページ名_AfterUpdate() MsgBox "" End Sub としたら確かにメッセージボックスは表示されるのですが 全てのコントロールにつけないとだめですか? 「サブフォームのレコードの値が変更したら」 とするにはどうすればいいでしょうか?

  • Access2013 vbaサブフォームのレコード

    [Access2013 vba] ■したいこと サブフォームのレコードの中から、一レコードだけをチェックボックスなどで選択したいのですが、どのようにしたら出来ますでしょうか。 複数行選択は出来ないようにしたいです。 選択したのち、メインフォームの選択ボタンを押すと、そのレコードのID番号を取得して、呼出元のフォームのIDフィールドに代入したいです。 ■画面の流れ・・・ Aフォーム → 帳票型Bフォームで、レコードを選び「開く」ボタンを押す→ B 'メインフォームとCサブフォーム)が開く Cサブフォームのレコードをチェックボックスにチェックを入れて選択する B ' メインフォームの「選択」ボタンを押すと B ' メインフォームと、その前のBフォームが閉じて Aフォームに戻り、AフォームのIDフィールドに選択したIDが格納される。 よろしくお願いします。

  • サブフォームが見えなくなる。

    サブフォームが見えなくなる。 Access初心者です。 メインフォームにサブフォームを入れ込んだのですが、メインフォームを新しいレコードに移動すると、サブフォーム自体が出てこなくなります。 データがあるレコードではきちんとサブフォームが出ていることが確認出来ています。 どうしていいのか判らないので教えて下さい。 マクロで入力ボタンを押すとメインのフォームを開き、新しいレコードに移動することをやっていますが、関係あるでしょうか? やりたいことはメインを新しいレコードに移動した時に、サブフォームが表示されて入力できるようにしたいということです。

  • アクセス2003のサブフォームコントロールの参照について

    アクセス2003で質問です。 メインフォームM1 サブフォームS1 サブフォームコントロールSCTL1 S1のフィールド T1と定義している場合に T1へサブフォームS1からオープンした別のフォームF1の値を代入したいのです。 マクロで値の代入の式を アイテムに [Forms]![M1]![SCTL1]![T1] と記述してもプロパティまたはメソッドが正しくないというエラーが表示されます。 同じ記述でアクセス2000では出来ました。 どこが違うのか教えて下さい。

  • アクセスのDMAXをVBAで記述したい

    今は、マクロで値の代入を使い アイテム=[ID] 式=DMax("ID","テーブル名")+1 として連番の次の番号を振ろうとしています。 これと同じことをVBAでやるにはどのように 記述すれば良いのでしょうか。 宜しくお願い致します。

  • サブフォームのコントロールの値を取得したい(VBA)

    連続投稿失礼します。 ファーム1のなかにサブフォーム(フォーム2)を設置しました。 フォーム2の中にはテキスト1があります。 VBAでテキスト1の値を取得したいのですがうまくいきません。 フォーム2を開いた状態で、 Sub test1() MsgBox Forms("フォーム2").Controls("テキスト1") End Sub を行なうと、 「あああ」 が返ってくるのですが、 フォーム2を閉じて、 フォーム1を開き、上のコードを実行すると、 「マクロの式、またはVisual Basicのコードで参照されている 'フォーム2'フォームが見つかりません。」 となってしまいます。 普段はフォーム2は閉じ、フォーム1を開いて使うため、 この状態でのVBAコードが知りたいです。 ちなみに変数を代入したいので 「Form_フォーム2.テキスト1」の書き方よりカッコでくくる書き方でご回答いただければ助かります。 よろしくお願いします。

  • accessのサブフォーム毎に連番をふり直す

    accessのフォーム入力において、メインのフォームにサブフォームが一つ配置されています。 単票形式のメインフォームには、フィールド「ID」(主キー)と「社員名」と「日付」、「評価」が格納されておさり、「ID」で紐付けされたサブフォーム(帳票またはデータシート形式)に、社員の行動記録が入力されます。 ※行動記録:08:30~10:00 A社訪問 …など。 サブフォームにデータが入力される際、行動した時系列順に項番を振って管理したいと考えています。 データ例 メイン ID  日付   社員名   評価 1 2016/03/16 田中一郎  C 2 2016/03/16 鈴木政夫  D 3 2016/03/17 田中一郎  B サブ ID 項番 開始時間 終了時間 業務内容 1 1  08:30   10:00  A社訪問 1 2  10:25   11:40  見積書作成 2 1  08:30   12:00  会議 3 1  12:50   16:30  現場監督 3 2  17:00   21:50  報告書作成 クエリやイベントプロシージャにDcountやDMax関数、carrentrecordなどを使ったアドバイスのある回答やブログを見付けて、色々と試してみたのですが、どれも上手く行きません。 一番簡単そうなDMaxをサブフォームの項番の既定値に =NZ(DMax("項番", "サブフォームのテーブル名")+1,1) とするも、「項番」の最大値+1の「3」が表示されます。 データの入力は、日付当日とは限らず、また、入力順序も、(新規にレコードを追加する場合を除き)ID順だとは限りません(後日修正を行う場合も有ります) こういった場合の対処方法について、ご教示をお願いします。 なお、当方の技能レベルは、VBAのコードの意味を理解しないまま、他人の作ったコードをコピーして、何となく修正して使用できている、と言った程度です。 よろしくお願いします。

  • Accessでのサブフォームの操作について

    Accessでのフォームの操作についてお教え下さい。 使用しているバージョンは2010です。 フォームAにボタンを設置し、フォームBを開くようにしました。 フォームAとBはIDで連携し、指定したレコードを開くようにしています。 フォームBには、サブフォームCがあります。 サブフォームCには複数のレコードが入っており、 こちらも指定したレコードを表示させてたいのですが方法が分かりません。 フォームAに設置したボタンを押すと、フォームBの指定したレコードを開き、 フォームB内にある、サブフォームCの指定したレコードを表示させたいです。 VBA等で制御することは可能でしょうか。 可能でしたら方法をお教え下さい。 宜しくお願いいたします。