Access VBA質問箱 IV

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

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


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

【13063】日付+自動採番 NUTKEY 16/9/8(木) 12:32 質問[未読]
【13064】Re:日付+自動採番 亀マスター 16/9/11(日) 2:02 回答[未読]
【13065】Re:日付+自動採番 NUTKEY 16/9/12(月) 9:28 質問[未読]
【13066】Re:日付+自動採番 亀マスター 16/9/12(月) 22:31 回答[未読]
【13067】Re:日付+自動採番 NUTKEY 16/9/16(金) 15:12 質問[未読]
【13068】Re:日付+自動採番 亀マスター 16/9/17(土) 18:08 回答[未読]
【13069】日付+自動採番 NUTKEY 16/9/19(月) 14:03 お礼[未読]

【13063】日付+自動採番
質問  NUTKEY  - 16/9/8(木) 12:32 -

引用なし
パスワード
   はじめて質問させていただきます。

早速ですが、以下のテーブルデータで、表形式のフォームを作成しています。

テーブル:提案
       ID  :オートナンバー(主キー設定)
       提案日:日付/時刻型
       提出月:短いテキスト

日付が入ったら提出月に年度(yy/mm)+連番(3桁)を表示させたいです。

例)

ID  提案日   提出月
1  20160801   1608001
2  20160831   1608002
3  20160901   1609001
4  20161001   1610001
5  20170101   1701001

初心者の為わかりやすくご教授頂ければ幸いです。

【13064】Re:日付+自動採番
回答  亀マスター  - 16/9/11(日) 2:02 -

引用なし
パスワード
   私が思いつくのは、フォーム上で提出日のデータを更新したときに、更新後イベントで提出月に自動入力するという方法でしょうか。


年度はFormat関数で
Format(提案日, "yy/mm")
とすればいいですね。

連番部分については、DCount関数で提出日と同じ月を含む既存のデータ数を数え、これをFormat関数で3桁にするということになると思います。

FirstDay = DateSerial(Year(提案日), Month(提案日), 1)
LastDay = DateAdd("d", -1, DateSerial(Year(提案日), Month(提案日) + 1, 1))
連番 = DCount("*", "提案テーブル", "提案日 Between #" & FirstDay & "# And #" & LastDay & "#")

これで連番を取得し、
Format(連番, "000")
で3桁の連番になりますね。

(Format、DateSerial、DateAdd、DCountなどのの使い方はわからなければ調べてください)

【13065】Re:日付+自動採番
質問  NUTKEY  - 16/9/12(月) 9:28 -

引用なし
パスワード
   亀マスター さん

早速の回答ありがとうございます。

クエリ(提案T)を作成し提出月に提出月: Format([提案日],'yyyymm')を作成し年度まで表示させました。

私なりに関数の意味を調べまして、
提案日の更新後処理(Private Sub 提案日_AfterUpdate())に以下を全て入れて操作してみたのですが
提出月に年度までは出てますが、連番が表示されません。
連番は、クエリのフィールドに直接式を入れるのかと思い、入れてやってみたのですが違うようでした。


月初との日付を取得する(年月までを抽出)
FirstDay = DateSerial(Year(提案日), Month(提案日), 1)

月末との日付を取得する(年月までを抽出)
LastDay = DateAdd("d", -1, DateSerial(Year(提案日), Month(提案日) + 1, 1))

[提案日]の値が月初-月末の日付(現在でやると20160901-20160930)のデータの個数を求める。
連番 = DCount("*", "提案T", "提案日 Between #" & FirstDay & "# And #" & LastDay & "#")


今回初めてVBAに挑戦していおり、全く知識がないまま質問して申し訳ありません。
これをきに勉強していこうと思っていますのでご面倒かと思いますが、
再度説明して頂けると助かります。

【13066】Re:日付+自動採番
回答  亀マスター  - 16/9/12(月) 22:31 -

引用なし
パスワード
   連番の取得までは問題ないと思います。

後はこれをデータに反映させる方法ですが、既に提出月のテキストボックスがフォーム中にあると思いますので(なければテーブルの提出月と連結したテキストボックスを作成してください)、提案日_AfterUpdateのイベントで、取得した連番等をテキストボックスに入力してやればいいのです。

具体的には、
提出月 = Format(提案日, "yymm") & Format(連番 +1 , "000")
としてやればいいでしょう。
※連番 + 1 としているのは、そのままだと連番が000からスタートするためです。連番取得の段階で事前に +1しておけば不要です。


とりあえずはこれで表示されると思いますが、実務を考えるといろいろ問題が出てくるかと思います。

まず、提出月のテキストボックスをそのままにしておくと、ここを直接編集されてしまいます。そこで、提出月のテキストボックスでプロパティ設定を編集し、「使用可能」を「いいえ」に、「編集ロック」を「はい」にしておくことで対応します。

また、入力済みの提案日を編集すると、その時点で提出月が再計算され、番号が狂ってしまいます。これを防ぐには、連番を計算・表示させる前に、更新前の日付を調べ、更新前が空白・同じ月・異なる月などの場合分けで対応する必要があるでしょう。

他に、たとえば8月1日、8月10日、8月5日という順で入力した場合、連番はこの順番になります。それで構わないのならいいのですが、日付順にしたいという場合は上記で述べた方法は使えないので、クエリの編集で少々ややこしいSQLを書く必要が出ると思います。

【13067】Re:日付+自動採番
質問  NUTKEY  - 16/9/16(金) 15:12 -

引用なし
パスワード
   亀マスター さん

連絡が遅くなりすいませんでした。

「使用可能」「編集ロック」は実施しました。

日付順に関しては入力日がバラバラなので問題なしです。

また、入力済みの提案日を編集することはないので問題なしです。


Private Sub 提案日_AfterUpdate()
  
Me![提案日] = Format(提案日, "yymm") & Format([連番] + 1, "000")
 
End Sub

と入れたのですがデバックが出てしまいます。

これでは条件がまずいのでしょうか?

そして、連番になってくれません・・・

クエリで入力するとできてはいるのですが、閉じてまた開くと連番ではなくなっています。
これは、亀マスター さんが前回の回答にも書かれたように、
『連番を計算・表示させる前に、更新前の日付を調べ、更新前が空白・同じ月・異なる月などの場合分けで対応する必要があるでしょう。』
に関係があるのでしょうか?


お手数ですが再度教えて下さい。

【13068】Re:日付+自動採番
回答  亀マスター  - 16/9/17(土) 18:08 -

引用なし
パスワード
   >Me![提案日] = Format(提案日, "yymm") & Format([連番] + 1, "000")
これは打ち込んだものと同一でしょうか。

もしそうなら、Me![提案日] は Me![提出月] が正しいのではないでしょうか。

あと、Format([連番] + 1, "000") とありますが、[連番]は何を指しているのでしょうか。
この書き方だと、フォーム中のテキストボックスか何かに「連番」という名前のものがあり、そのデータを拾うことになりますよ。前に示した
連番 = DCount(...
で取得した連番を意味するのであれば、[ ]はつけてはいけません。
それと、勿論このコード中で、連番を先に取得しておく必要があります。流れとしては、 連番取得 → 提出月のテキストボックスに入力 となりますので。


>クエリで入力するとできてはいるのですが
今回私が提示した方法では、クエリは必要ありませんよ。(使ったらダメなわけではないですが)
提出月のテキストボックスに、手動で連番を数えて入力する代わりにVBAで入力しているという状態なので、クエリによる計算は不要です。

>これは、亀マスター さんが前回の回答にも書かれたように、
>『連番を計算・表示させる前に、更新前の日付を調べ、更新前が空白・同じ月・異なる月などの場合分けで対応する必要があるでしょう。』
>に関係があるのでしょうか?
入力日がバラバラで、一度入力したら変更することがないとのことですので、それなら問題はありません。

頑張ってくださいね。

【13069】日付+自動採番
お礼  NUTKEY  - 16/9/19(月) 14:03 -

引用なし
パスワード
   亀マスター さん

提出月が正しかったです。
入力間違いでした・・・

[]もはずしました。

クエリは必要ないのですね・・・
年月表示もFIRSTDAY、LASTDAYも全てクエリでしていました。

もう一度作り直してがんばってみます。

私の質問に回答して頂きありがとうございました。

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