Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


218 / 2272 ツリー ←次へ | 前へ→

【12492】連番の入力 くやっち 14/4/10(木) 19:04 質問[未読]
【12493】Re:連番の入力 えは2 14/4/11(金) 13:59 回答[未読]
【12502】Re:連番の入力 くやっち 14/4/17(木) 12:55 お礼[未読]
【12505】Re:連番の入力 hatena 14/4/17(木) 19:41 回答[未読]
【12512】Re:連番の入力 くやっち 14/4/21(月) 10:04 お礼[未読]

【12492】連番の入力
質問  くやっち  - 14/4/10(木) 19:04 -

引用なし
パスワード
   Access2003を使用しています。
先日、オートナンバーの飛び抜けで質問をさせていただきました。
その時にDMax関数を教えて頂き、ちょっとやってみたのですが、どうもうまく動作しないため、ご相談させていただきました。

データ入力用のフォーム上に、いくつかのコンボボックスが配置されており、そのフォームの一部に連番表示用のテキストボックスを配置しました。

フォーム未入力時(開いた時)には、連番用テキストボックスに値は入りません。
いくつかのコンボボックスの内、「件名」というコンボボックスをクリックすると、入力が開始されたと認識させようと、以下の構文を書きました。

Private Sub 件名_Click()
If (Me.NewRecord) Then Me.連番 = Nz(DMax("連番", "テーブル"), 0) + 1
End Sub

ところが、このコンボボックスをクリックした時に、連番のテキストボックスに値が入らず、同じフォーム上にある、カレンダーコントロール用のテキストボックスをダブルクリックして、カレンダーを表示させたときにのみ連番が入力されます。

フォームを開いて、最初にカレンダーコントロールをダブルクリックしても連番が入力されないことから、機能はしているのだと考えています。
フォーカス取得時や変更時に同じイベントを発生させても同様でした。
どうも、別のフォーム(ここではカレンダー)がアクティブになると連番が入力されるようなのですが、これを件名のコンボボックスをクリックしたときに連番が入るようにできるのでしょうか?

ちなみに、そのコンボボックスは別テーブルからデータを表示してリストからしか値が入らないようにしています。


Access初心者なので、分かりづらい文章で申し訳ありませんが、よろしくお願いいたします。

【12493】Re:連番の入力
回答  えは2  - 14/4/11(金) 13:59 -

引用なし
パスワード
   ▼くやっち さん:

同じような事をやってみましたが当方環境ではコンボボックスを
クリックした瞬間にテキストボックスに表示されました。

正しくコードが実行されているか確認してみて下さい。
既存レコードでクリックした時の処理を加え
If文にブックマークを設定してみて下さい。

またデータ更新と画面表示のタイミングは
一致しない事があるので画面表示更新してみて下さい。

Me.Refreshで画面表示更新するので
コードに追加するといいと思います。

---------------------------------------------
If (Me.NewRecord) Then
  Me.連番 = Nz(DMax("連番", "テーブル"), 0) + 1
Else
  Me.連番 = "9999"
End If
Me.Refresh

【12502】Re:連番の入力
お礼  くやっち  - 14/4/17(木) 12:55 -

引用なし
パスワード
   ▼えは2 さん:

ご返事が遅くなり、申し訳ありませんでした。

ご指摘のように"Me.Refresh"で更新ができるようになりました。
ありがとうございました。

ところで、本当に初歩的なことで申し訳ありませんが、
ご指摘の構文で、NewRecordではない場合の動作として
Me.連番 = "9999"
と言うことですが、この"9999"にはどのような意味があるのでしょうか?
自然数の指定とかを意味しているのでしょうか?

それとも9999という数字が入るってことでしょうか?
もしそうならNewRecord以外の場合は、既存のIDが入っていなければならないので、不要として削除しても大丈夫ですか?

調べたのですが、なかなか載っていないんです。

【12505】Re:連番の入力
回答  hatena  - 14/4/17(木) 19:41 -

引用なし
パスワード
   ある処理をするには最適なイベントと言うのものあります。

> いくつかのコンボボックスの内、「件名」というコンボボックスをクリックすると、入力が開始されたと認識させようと、以下の構文を書きました。

もし、そのコンボボックスをクリックせずに他のコンボボックスから入力して、レコード保存してしまったら、連番が未入力になるということも考えられます。

フォームのイベントを見てみると、「挿入前処理」というものがあります。ヘルプを見ると、
-------------------------------------------------------------------------
BeforeInsert イベントは、新規レコードに最初の文字を入力したときに発生します。
-------------------------------------------------------------------------
とあります。
このイベントが希望の処理には最適だと思われます。

Private Sub Form_BeforeInsert(Cancel As Integer)
  Me.連番 = Nz(DMax("連番", "テーブル"), 0) + 1
End Sub


Refresh するとレコード保存されます。そうするとEscで入力取消ができなくなります。その辺も考慮する必要があります。
よくよく考えて設計してください。

別案として、レコード移動時に、既定値プロパティを設定するという方法もあります。
この場合は、新規レコードへ移動した時点で、連番が表示されます。

Private Sub Form_Current()
  If Me.NewRecord Then Me.企業ID.DefaultValue = Nz(DMax("連番", "テーブル"), 0) + 1
End Sub


お好みで選択してください。

【12512】Re:連番の入力
お礼  くやっち  - 14/4/21(月) 10:04 -

引用なし
パスワード
   ▼hatena さん:

ありがとうございます。

一応、「件名」という項目は絶対入れる項目なので、連番抜けが起きることはないと考えています。

また、レコードの登録は同じフォームに「登録」ボタンを配置し、
DoCmd.GoToRecord , , acNext
を実行しています。

また、レコードの取り消しも「クリア」ボタンを配置して、
DoCmd.DoMenuItem acFormBar, acEditMenu, acUndo, , acMenuVer70
を実行するようにしています。

今の所思い通りに動作しているようです。

今後、不都合が出てきた場合に参考にさせて頂きます。
大変ありがとうございました。

218 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078190
(SS)C-BOARD v3.8 is Free