Accessは全くの初心者です。
プログラマーさんのサイトや質問サイトを参考に、初めてデータベースを作っているのですが、
どうしても文字+年ごとの自動採番がうまくいきません。
挿入前処理で「営250001」のように漢字1文字+和暦2桁+4桁連番にして、
年が変わるごとに4桁連番を0001に戻したいのです。
今入力してあるコードは以下の通りです。
-----------------------------------------------------------------------------
Private Sub Form_BeforeInsert(Cancel As Integer)
Dim vDt As Variant
vDt = DMax("番号", "営テーブル", "番号 Like '" & Format(Date, "ee") & "*'")
If (IsNull(vDt)) Then
番号 = "営" & Format(Date, "ee") & "0001"
Else
番号 = "営" & Left(vDt, 2) & Format(Val(Right(vDt, 4)) + 1, "0000")
End If
End Sub
-----------------------------------------------------------------------------
この状態では、0001のまま採番が進まず、行き詰ってしまいました。
他の質問者さんが(Date,"ee")を(Now,"nn")に置き換えて、分ごとの採番を試していたのを参考に、
「"営"&」を取って、採番が進むところまでは確認できました。
使っているのはAccess2003です。
どうか、よろしくお願いします。
No.1ベストアンサー
- 回答日時:
> vDt = DMax("番号", "営テーブル", "番号 Like '" & Format(Date, "ee") & "*'")
これでは、先頭の 「漢字1文字」 が無視されていますね。
vDt = DMax("番号", "営テーブル", "番号 Like '営" & Format(Date, "ee") & "*'")
とか、
vDt = DMax("番号", "営テーブル", "番号 Like '?" & Format(Date, "ee") & "*'")
さらに
> 番号 = "営" & Left(vDt, 2) & Format(Val(Right(vDt, 4)) + 1, "0000")
を
番号 = Left(vDt, 3) & Format(Val(Right(vDt, 4)) + 1, "0000")
上記は
"営テーブル"の "番号"フィールドには , 「営250001」 のように保存されているものとします。
1桁目は"営"固定の場合です。
そうでない場合は、また変わってきます。
できました!
vDtで定義した中にも1桁目の漢字が入らなければいけなかったんですね…
「"番号 Like '"」の部分が理解できていなかったので、
どこに1桁目の漢字を定義していいのかがわかっていませんでした。
教えていただいたとおりに直し、あらためてヘルプ等でLike演算子を調べ、
なんとなくですが、理解できた気がします。
テーブルごとに1桁目の漢字決め、固定して使うので教えていただいたコードで
進めたいと思います。
ありがとうございました。
No.2
- 回答日時:
以下でどうなりますか
Private Sub Form_BeforeInsert(Cancel As Integer)
Dim vDt As Variant
Dim sS As String
sS = "営" & Format(Date, "ee")
vDt = DMax("番号", "営テーブル", "番号 Like '" & sS & "*'")
If (IsNull(vDt)) Then
番号 = sS & "0001"
Else
番号 = sS & Format(Val(Right(vDt, 4)) + 1, "0000")
End If
End Sub
※ "営25*" で探すので、"事250123" とかあったら、
"営" / "事" それぞれでの採番になると思います。
※ "営25" を作るところは1箇所にします。
ほぼないと思いますが、前後で年を越したら・・・・
もしかして http://oshiete.goo.ne.jp/qa/5749336.html とかを見られました?
そこでは2箇所に記述していましたが・・・
なお、以下のような書き方もあるかも(未検証)
(DMax の戻り値の時に数値にしておく)
Private Sub Form_BeforeInsert(Cancel As Integer)
Dim sS As String
sS = "営" & Format(Date, "ee")
番号 = sS & Format( _
Nz( _
DMax("Val(Right(番号, 4))" _
, "営テーブル" _
, "番号 Like '" & sS & "*'") _
) + 1 _
, "0000")
End Sub
余談)
挿入前処理での採番ですが、更新前処理で採番する事もあると思います。
タイミング的にどちらが良いのか、それは判断してください。
その時には、新規レコードか判別して・・・・以下雰囲気で
Private Sub Form_BeforeUpdate(Cancel As Integer)
Dim vDt As Variant
Dim sS As String
If (Me.NewRecord) Then
sS = "営" & Format(Date, "ee")
vDt = DMax("番号", "営テーブル", "番号 Like '" & sS & "*'")
If (IsNull(vDt)) Then
番号 = sS & "0001"
Else
番号 = sS & Format(Val(Right(vDt, 4)) + 1, "0000")
End If
End If
End Sub
不都合あれば修正してください。
そうです!
その質問ページを参考に、今の自動採番を作っていました。
30246kiku様が丁寧に回答されていたので、全くの初心者の私にも
だいぶ理解できるものでした。
私の質問にも回答いただけて、なんかちょっと嬉しい気が…(^^)
本題ですが、
「漢字+年」と「連番」で分けるという方法もあるんですね。
見た目がシンプルで、わかりやすいかも…
肝心の動作確認ですが、実はまだできてません^^;
職場へのデータの持込・持出厳禁なのと、自宅PCにAccessが入っていないのとで、
仕事の合間に作っている現状なのです。
とりあえずなお礼で申し訳ありませんが、この方法の動作確認ができたら、
最初の方法とどちらがいいか、検討したいと思います。
ちなみに、未検証で書いていただいたコードは、
すいません!Nz関数を調べてみても、初心者すぎる私には理解が難しく。。。
処理のタイミングも、どこか入力し始めたら番号が出るようにしたいので、
挿入前処理で進めたいと思います。
たくさんの回答例をいただき、ありがとうございました。
No.3
- 回答日時:
主キーに複数の意味を持たせるな
http://hatenachips.blog34.fc2.com/blog-entry-201 …
絶対に・・・というわけではないと考えますが
人間にとって分かりやすい ≒ データベースの処理に適切
だと思います。
作成中、いろいろ検索した中で、リンクしていただいたページも見てました。
たしかに、このままでは主キーとしては不安定ですよね。
この自動採番は、以前から使用していた番号の形式を使い、
何かの時にはこの番号で検索もしたいとのことだったので、
この番号以外に、オートナンバーの主キーを設定しています。
教えていただき、ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
- Access(アクセス) Access IF文でテーブルに存在しない場合の処理について 2 2022/10/10 18:09
- Visual Basic(VBA) excel2021で実行できないマクロ。どこを直したらいいのか 2 2022/03/28 03:40
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- Visual Basic(VBA) Excelにて、シート1の行を削除するとシート2のシート1と同じ番号の行も削除したい 3 2022/05/08 04:24
- Visual Basic(VBA) VBAで日付入力しているのですが 4 2023/03/02 11:25
- Visual Basic(VBA) テーブルを配列に入れて、元のテーブルの行番号を取得したい 1 2022/08/16 20:15
- Visual Basic(VBA) InputBoxでキャンセルボタンを押したらファイル自体を閉じたい 3 2022/07/23 17:52
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
access 自動採番 年が変わるごとに0001に戻る仕組み。
その他(データベース)
-
accessでオートナンバーを使わずに「文字+数字」の自動採番する方法
Access(アクセス)
-
accessでの文字列の混ざった連番処理について
Access(アクセス)
-
-
4
access 自動採番 「10-AA-0001」にするには。
その他(データベース)
-
5
ACCESSで日付ごとに自動連番(日付+連番)する方法
Access(アクセス)
-
6
Accessで、固定アルファベット+オートナンバーを表示する
Excel(エクセル)
-
7
主キーはオートナンバー型のIDを使った方が良いのか
Access(アクセス)
-
8
ACCESSでオートナンバーを任意の書式で付けたい
Access(アクセス)
-
9
新規レコード行を非表示にしたい
Access(アクセス)
-
10
Accessで日付が変わると番号がリセットされる自動採番がしたい
Access(アクセス)
-
11
Accessでレコードの複製
Access(アクセス)
-
12
文字を含むIDの自動採番
その他(Microsoft Office)
-
13
Accessのフォーム上にレコード数とレコード番号の表示
その他(データベース)
-
14
ACCESS更新クエリで型変換エラー
Access(アクセス)
-
15
Accessで、一覧からクリックして詳細表示したい
その他(Microsoft Office)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Accessで別テーブルの値をフォ...
-
Accessでのレコード存在チェック
-
条件をつけて日付の古い行を抜...
-
【SQL】existsでの商演算
-
アクセスで「空き番」の確認
-
Recordset.FindFirstについて
-
SQL文について
-
Access:抽出して、色をつけたい。
-
GROUP BYを行った後に結合した...
-
Oracleでの文字列連結サイズの上限
-
SELECTで1件のみ取得するには?
-
select insertで複数テーブルか...
-
カレントレコードが無い事を判...
-
Excelでセルの書式設定を使用し...
-
Date型にNULLをセットしたい V...
-
データセットのレコード更新が...
-
select句副問い合わせ 値の個...
-
SQL文で右から1文字だけ削除す...
-
ADO VBA 実行時エラー3021
-
SELECTの結果で同一行を複数回...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Accessで別テーブルの値をフォ...
-
Accessでのレコード存在チェック
-
最新の日付とその金額をクエリ...
-
access 自動採番 年が変わる...
-
[Access]異なるレコード間の文...
-
【アクセスVBA】テーブルにフィ...
-
vba 直前の操作はキャンセルさ...
-
条件をつけて日付の古い行を抜...
-
Accessで日付が変わると番号が...
-
質問です。 下記のテーブルとデ...
-
Recordset.FindFirstについて
-
Access 文字+年ごとの自動採番
-
アクセスで「空き番」の確認
-
Accessの色番号について
-
access2003で学籍番号から生徒...
-
Access:抽出して、色をつけたい。
-
【Access】選択クエリのグルー...
-
access 自動採番 「10-AA-000...
-
電話番号の局番と住所の検索に...
-
sqlで質問です。 Aテーブルの登...
おすすめ情報