access 自動採番 「10-AA-0001」にするには

このQ&Aのポイント
  • accessの自動採番機能を使用して、「10-AA-0001」という番号を作成したい場合の方法について教えてください。
  • 現在、自動採番で「AA-0001」という番号を作成することができていますが、年を示す「2010」という数字を追加して「2010-AA-0001」としたいです。また、年が変わると自動的に次の年の数字に変更されるようにしたいです。
  • 現在、VBAとマクロの両方で試してみましたが、うまくいきません。DMAX関数とDBMAX関数の違いについても教えていただきたいです。
回答を見る
  • ベストアンサー

access 自動採番 「10-AA-0001」にするには。

宜しくお願いします。 仕様環境:access(2002-2007) 自動で番号を割り振る機能を作っています。 (以前に似た質問をしたのですが、前より理解度が上がったので、ご了承くださいm(__)m) ・・・ まずテストDBなので、テーブルは「案件」一つだけです。 フォームも簡易的な単票形式で簡単なものです。 番号は他のテキストボックスに何か挿入する前の 「挿入前」のイベントを遣っています。 そこで、ご相談です、 まず自動採番で「AA-0001」というものが作れました。 また別フォームに移動し、他のテキストボックスを入力しようとすると 「AA-0002」になりました、以降も~0003、~0004となり成功しました。 そこで更に付け加えたいと思っています。 それは、 「2010-AA-0001」にしたいと思っています。 ご覧の通り、「2010」は「年」です。 更には完成系として「10-AA-0001」と言う風に「年」にあたる、2010の「10」だけ、 抜き出したいと思っており、来年には自動的に2011の「11」にしたいと思っております。 date関数なのかなー、とは何となく思っているのですが、いろいろ工夫してみたのですが、 うまくいきません。 これはマクロでは無理でしょうか? フォームをVBAに変換したものとマクロを記載させて頂きます。 よろしくお願いします。 '------------------------------------------------------------ ' Form_BeforeInsert ' '------------------------------------------------------------ Private Sub Form_BeforeInsert(Cancel As Integer) On Error GoTo Form_BeforeInsert_Err If (DCount("見積り番号", "案件") = 0) Then 見積り番号 = "AA-0001" Exit Sub End If 見積り番号 = Format(DMax("Right(見積り番号,4)", "案件") + 1, "AA-" & "0000") Form_BeforeInsert_Exit: Exit Sub Form_BeforeInsert_Err: MsgBox Error$ Resume Form_BeforeInsert_Exit End Sub ・・・・ マクロの場合     条件                     アクション ---------------------------------------------------------- 1行目 DCount("見積り番号","案件")=0   値の代入    アイテム: [見積り番号]    式:    "AA-0001" ---------------------------------------------------------- 2行目 ...                      マクロの中止 ---------------------------------------------------------- 3行目                       値の代入    アイテム: [見積り番号]     式:    Format(DMax("Right(見積り番号,4)","案件")+1,"AA-" & "0000") ---------------------------------------------------------- ・・・・    こんな感じです、 (単体のテーブルを作り、他のテーブルと組み合わせるつもりです) また余談ですが、DMAX関数とDBMAX関数の違いがわかりません、 調べても(google)出てきません、これは何か違いがあるのでしょうか? 教えてください、宜しくお願いします。

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

  • ベストアンサー
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.1

(1) はずしていたらごめんです。 見積り番号 = Right(Format(Date, "yyyy", 2), 2) & "-" & Format(DMax("Right(見積り番号,4)", "案件") + 1, "AA -" & "0000") (2) >また余談ですが、DMAX関数とDBMAX関数の違いがわかりません、 私も知りません。ヘルプにも出てきません。 逆にどこにあります?

23tomo-u
質問者

補足

piroin654 様 回答ありがとうございます。 まず(2)の件の「DBMAX関数」についてはここで見つけました ↓ http://oshiete1.goo.ne.jp/qa4125946.html というか、恥ずかしながら、僕が去年質問した内容の回答で、 先日、今回の質問を検索していて見つけたものですね(汗) (去年はさっぱりだったので・・) (1)の件ですが、VBAで上手くいきました。 マクロでは、 「このオブジェクトには、オートメーションオブジェクト'date'は含まれません。」 というエラーが出て出来ませんでした。 最初の「見積り番号 =」はとったのですが・・ なんかマクロの限界を感じました。。 (VBAがさっぱりなのでマクロでがんばっていたのですが・・) マクロだと二つのフィールドに分けてごまかしごまかしで やった方がいいのかも知れません(素人考えですが)。 あと、この質問をする前段階からなのですが、何度もVBAやマクロを 書き換えたりしていると、番号を進まない時があります。 例えば、「AA-0002」だと、次のレコードも、また次のレコードも 「AA-0002」が表示され番号が続かない時が多々ありました。 その場合は、テーブル内のレコードを全て削除して、VBAも削除して 綺麗な状態で検証するとまた番号が増えるようになりました。 同じように今回の「10-AA-0002」も同じ現象が発生しました。 (綺麗にすると番号がちゃんと割り振られるのですが。) もし何か見解があれば教えてください。 なければ結構ですので、気が向いたら、 ご意見を宜しくお願いします。(数日したら締め切ります) ありがとうございました。m(_ _)m

その他の回答 (3)

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.4

>番号を進まない時があります ひょっとして「案件テーブル」の 見積り番号の更新、あるいは レコードの追加がうまく行われなかった ということが一番の現象の発端で、 これがどこに由来するかは、 プログラムなのか、全体の イベントの流れなのか、 あるいはファイルの肥大によるもの なのかはわかりません・・・・、 ということも考えられます。

23tomo-u
質問者

補足

piroin654 様 仰るとおりです。 ただ、ファイルの肥大はちょっと考えずらいところもあります。 テストでDBを作ったので、最大でも30件ぐらいレコードの テーブル(1個)、そしてフォームも一つだけです。 現時点でレコードが大幅に増やすと逆に面倒になるので(笑)。 ある程度レコードが増えたら、一旦テーブルから全削除してますね。 まず、「仕組みをしっかりしてから」って感じですかね。 ありがとうございます。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.3

式が複雑で計算に矛盾が生じて、という ことでもないようなのですが、プログラム の書き換えなどでファイルが大きくなった ときに、ときたまデータの表示がおかしく なることは経験したことはあります。 最適化などで対応できるならば、という ことも提案できます。 見積り番号の取得をコードで、また違う 方法でしてみるというのもこのような 現象を回避できる方法になり得るかも しれません。 また、質問のマクロを実行するイベント にマクロをVBAコードとして挿入し、イベントの 流れを確認しながらデバックしていけば どこがネックになっているかも確認できる のではとおもいます。 そのときに、質問の見積り番号の取得に関しても 一度に取得しないで、分解して変数に格納し、 改めてセットして取得をするという方法で 滞るポイントを探すということもいいのでは とおもいます。 いろいろな場面でのデバッグはこのような ことをしばしば行います。 ときには、 Debug.Print 変数(または関数の戻り値) & ("何とか") のようにして変数の変化を確認することも します。 質問欄に提示されたマクロを書けるならば VBAはそれほどむかしくないと思います。 マクロを作ってはコードに変換し、なるほど こう書くのかと覚えることも一つの方法 です。VBAでは条件分岐(If、SELECT CASE など)の制御法、検索などのやりかたを おぼえると、あとは楽なものです。 プロパティ、オブジェクトの制御などは その都度ヘルプやオブジェクトブラウザ で確認すればいいものです。私もオブジェクト の性質やプロパティはいちいちおぼえていません。 どうしてもマクロのほうが、というものは 一つか二つくらいですし、むしろコードで制御 する方向をめざしたほうが今後にもいいと 思います。VBAは言葉をおぼえるときと 同じで、簡潔なものの集まりと"てにをは" の使い方です。 肝心なことからずれてしまいました。

23tomo-u
質問者

補足

このつながりは一つにまとめました。 宜しくお願いしますm(_ _)m

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.2

たぶん、おそらく、なんとなく、 http://okwave.jp/qa/q3932046.html ここのことですか? 自作関数ですね。 DMAXが遅いから作ったということですが。 試していないのでわかりません。 DMAXの代替関数はいろいろ作られて います。 アルゴリズム、検索などで ググるとさまざまなデータの検索 方法が出てくると思います。それらの アルゴリズムをAccessで使える手段を 利用して最適な関数を作って実現する というのも一つの方法です。C言語などを学習 するときには必ず出くわす分野であり、 重要な分野です。 これ以上はやめておきます。興味が あったら調べてみてください。

23tomo-u
質問者

補足

piroin654 様 回答ありがとうございます。 結果はもう一つの方にまとめさせていただきました。

関連するQ&A

  • access 自動採番 年が変わるごとに0001に戻る仕組み。

    宜しくお願いします。 使用環境:access(2002-2007) 前回の続きでもありますが、自動で番号を採番する仕組みを作りました。 (一応、前回分も・・)http://oshiete1.goo.ne.jp/qa5742518.html 「10AA0001」から始まり、あとは後ろの数字が0002,0003~と増えていく仕様で出来ました。 最初の「10」というのは2010年のうしろ二桁の「10」です。(date関数) (相談) これを2011年になったら、後ろの数字を0001に自動的にセットし直す仕様にしたいのです、 そこから0002,0003~と増えるようにして、また年が変わるごとに0001にセットされるような仕組みにしたいです。 検索サイトで調べるとやり方が出てくるのですが、 まだVBAの理解力がないので、まったくもってわかりません。 たぶんIfで示されるDcount関数に関係があるのかなー、という気はします。 (前置きの部分なので) 僕にはちょっとレベルが高いかも知れませんが、理解できるよう努力します。 以下に、構文を書きます。 また来年になるまで「実際、変わるか検証ができない」というのもアレなので、 テスト環境ではnow関数を使い「hhnn」でやってます。 「分」が変わるごとに0001に戻れば自分なりにOKだと思っています。 (now関数で連番動作することは確認できました) ・・・・・・・・・ '------------------------------------------------------------ ' Form_BeforeInsert ' '------------------------------------------------------------ Private Sub Form_BeforeInsert(Cancel As Integer) On Error GoTo Form_BeforeInsert_Err If (DCount("見積り番号", "案件") = 0) Then 見積り番号 = "00AA0001" Exit Sub End If 見積り番号 = Right(Format(Date, "yyyy", 2), 2) & Format(DMax("Right(見積り番号,4)", "案件") + 1, "AA" & "0000") Form_BeforeInsert_Exit: Exit Sub Form_BeforeInsert_Err: MsgBox Error$ Resume Form_BeforeInsert_Exit End Sub ・・・・・・・・・ ○ now関数の場合 ※一文のみ抜粋 ・・・・・ 見積り番号 = Right(Format(Now, "hhnn", 2), 2) & Format(DMax("Right(見積り番号,4)", "案件") + 1, "AA" & "0000") ・・・・・ 教えてください、宜しくお願いします。

  • 文字列を含んだ自動採番

    ■見積番号というテーブルに、Dmaxで最大値+1で番号を取りたいのですが、うまくいきません。 見積番号は、「AA-9999」という形で、テキスト型です。 そしてAAのところは、Indexにコンボボックスで[リスト_チーム名]というものから選択した値を使いたい。 http://okwave.jp/qa/q5742518.html を参考に下記の式をつくってみました。 フォームの[リスト_チーム名] の値をうまくもってこれないことと、 クエリで表じするとレコード数が、Max値と同じ数だけどんどん増えていくのが問題です。 どなたか教えてもらえませんか。 ----------------------------------------------------------- 式1: Format(DMax("Right(見積番号,4)","■見積番号")+1,"Forms![F_A_Index]![リスト_チーム名] " & "-" & "0000")

  • Accessで日付が変わると番号がリセットされる自動採番がしたい

    Microsoft Accessで下記のようなデータベースを作っています。 テーブル名:TB_受付 テーブルデザイン 受付番号:テキスト型 受付日:日付/時刻型(yyyy/mm/dd) 番号:数値型 コース種類:テキスト型 備考:テキスト型 テーブルイメージ 受付番号    受付日    番号  コース種類  備考 ------------------------------------------------------------ 20051201受付1   2005/12/01   1 20051201受付2   2005/12/01    2 20051201受付3   2005/12/01    3 ・     ・ ・                   ・ 20051202受付1    2005/12/02 というように、受付日が変わると番号が1に戻るような採番をしたいのです。 上記テーブルを元に作成したフォームで、 受付日にはDate関数でその日の日付が入るようにしています。 フォームの更新前処理に下記のコードをいれています。 Private Sub Form_BeforeInsert(Cancel As Integer) If DCount("番号", "TB_受付") = 0 Then Me![番号] = "1" Else Me![番号] = Format(DMax("番号", "TB_受付") + 1) End If End Sub さらにコース種類の更新後処理に Me![受付番号]=Format("受付日,"TB_受付")&"受付"&Format("番号","TB_受付") というコードを書いて日付&番号が、[受付番号]のところに表示されるようにいろいろやっているのですが、日付が変わると番号をリセットさせることがなかなかできません。 VBAはあまり理解できている方ではないのですが、いろいろ検索をしたり調べたりしてたどり着いたのが上記です。 日付でリセットされる採番をするにはあと何をすればよいか、もしくは根本からこうしたほうがいいというのがあれば、とも思うのですが 詳しい方に教えていただけないでしょうか?

  • access 請求番号の自動採番

    まったくわかりません! よろしくお願いします。 仕様環境 WinXP  access2002 顧客管理のシステムを作っています。 テーブル 顧客テーブル(主キーは顧客番号 テキスト型) 請求テーブル(主キーは請求番号 テキスト型) 明細テーブル(主キーは明細番号でオートナンバー ダミーみたいな感じで使っています。) そしてリレーションシップで顧客テーブル(1)→(多)請求テーブル(1)→(多)明細テーブルになっています。 顧客情報を入力するフォームを作りました。 主キーは顧客番号(テキスト型,入力モードON,インデックス いいえ)で 他のテキストボックス(例えば名前)に何かしら文字を入力すると自動で顧客番号を採番してくれます。 例:0001 0002 0003~ そしてそのフォームから請求書作成フォームに飛ぶように 「請求書作成ボタン」を作り、顧客情報も一緒にひっぱっていってくれる 請求書作成フォームを作りました。(入力したばかりの情報も最新の情報で更新してくれます。) ・・請求書作成フォームはサブフォームを使い3つのテーブルからなっています。・・ 親フォーム:顧客テーブルから。 子フォーム:請求テーブルから。 孫フォーム:明細テーブルから。 主キーは請求番号で(テキスト型,入力モードON,インデックス はい(重複なし)) 他のテキストボックス(例えば請求日)に何かしら入力すると自動で請求番号を採番してくれます。 例:A0001 そこで問題なのですが、顧客情報は入力する度、次々自動で採番してくれるんですが、 請求番号は一番最初のレコードの”A0001”だけ採番してくれて、 新しいレコードで請求書を作ろうとテキストボックスに文字を入力すると「型が一致しません」というエラーが出ます。 ○ エラー内容 アクションエラーの実行 条件 true アクション名 値の代入 引数 [請求番号],Format(DMax("請求番号","請求マスタ")+1,"A0001") マクロは・・(参考書を参考にしています、マクロ名:自動採番マクロ) ------------------------------------------------- 条件 : DCount("請求番号","請求テーブル")=0 アクション : 値の代入 アイテム  : [請求番号] 式     :"A0001" ------------------------------------------------- 条件    : ... アクション : マクロの中止 ------------------------------------------------- アクション : 値の代入 アイテム  : [請求番号] 式     : Format(DMax("請求番号","請求テーブル")+1,"A0001") ------------------------------------------------- となっています。 念のため、主キーの入力モードを切り替えたり、式の"A0001"を単純に"1"にしたりしましたが、 請求番号はエラーが発生します。 原因がまったくわかりません。 よろしくお願いします!

  • アクセスVBAのエラーについて

    フォームを閉じるためにフォームにボタンを置いて、イベントプロシージャに下記のように書き込みました。すると添付画像のエラーが返ってきてマクロが動きません。 Private Sub コマンド103_Click() On Error GoTo Err_コマンド103_Click DoCmd.Close Exit_コマンド103_Click: Exit Sub Err_コマンド103_Click: MsgBox Err.Description Resume Exit_コマンド103_Click End Sub で、「ファイル-オプション-現在のデータベース」の”フォームの表示”を問題のフォームに切り替えたら問題なく動作します。 つまり”フォームの表示”で選んだフォームでしかコマンドボタンのマクロが動きません。全てのフォームでマクロが動くにはどうしたらよいのでしょうか?

  • ACCESSでの自動採番

    立て続けの質問お許しください。 Accessで、自動採番をしていきたいのですがアドバイスお願いいたします。 フィールド1→年度 (ex.2003) フィールド2→採番番号 (ex. 01) というものを作って、フォームでフィールド1、2ともに自動採番していきたいと考えています。 (2003 01, 2003 02,・・・・というふうに自動採番していきたい) しかし、来年の4月になったらフィールド1の年度を"2004"に自動変更し、変更後、フィールド2の値を1から取り直したいのです。このようなことを自動でやるのは可能なのでしょうか? DMAX関数を使って・・・と思ったのですが、年度が変更したときにどのようにフィールド2の値を1から取り直せばいいのかが分かりません。あと、2004年4月になって初めてフィールド1の値を2004と更新したいのですがどうやればいいかわかりません。 どなたか詳しい方お願いします

  • サブフォームで自動採番

    お世話になります。ACCESS2000で制作しています 主テーブル(マスタ)に顧客コード(主キー)、 サブテーブル(トラン)に顧客コードと枝番 というフィールドがあります。 顧客コードでリレーションシップを結んでいます。 それぞれのテーブルからクエリを経てフォームをつくり (Q_マスタ→F_マスタ、Q_トラン→F_トラン) また、検索フォームも別に作っています。 F_トランはF_マスタに埋め込んでいます。 検索フォームで検索して該当するデータが無い場合 DoCmd.OpenForm "F_マスタ", , , , acFormAdd で新規フォームを呼び出します。 このときサブフォームの枝番に自動的に「1」を入れたいのですが (開く時でも読み込み時でもいつでもいいのですが) どうしたら良いのでしょうか? ちなみに今は サブフォームのプロシージャで Private Sub Form_Open(Cancel As Integer)  If Me.NewRecord Then   Me![枝番] = 1  Else   Me![枝番] = DMax("枝番", "Q_トラン") + 1  End If End Sub としています。 こうするとQ_マスタの一番上のデータが 例えばQ_トランレコードを2つ持っていると 「3」と出てしまいます。 どのようにすればいいのでしょうか。 よろしくお願いします。

  • ACCESS エラーメッセージ表示されない理由

    ACCESSのエラーメッセージ表示について教えてください。 ACCESS2000でマクロを作成しました。 あるデータを読み込み、テーブルへ反映させるマクロです。 マクロを直接実行すると、データが存在しないとき、当然、エラーメッセージが表示されます。 ところが、このマクロをフォームから実行させると、同じ状況でエラーメッセージが表示されません。 どこに問題があってメッセージが表示されないものなのでしょう。(正常系の処理は正しく行われます) フォームのボタンにマクロの実行を定義しただけなのですが。 VBAを開いてみても、下記のとおりクリックされたときエラーならメッセージを表示しなさいと定義されています。 Private Sub コマンド1_Click() On Error GoTo Err_コマンド1_Click   Dim stDocName As String   stDocName = "マクロ名"   DoCmd.RunMacro stDocName Exit_コマンド1_Click:   Exit Sub Err_コマンド1_Click:   MsgBox Err.Description   Resume Exit_コマンド1_Click End Sub

  • Access 文字+年ごとの自動採番

    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です。 どうか、よろしくお願いします。

  • access2000"社員管理システム"を利用しています。

    access2000"社員管理システム"を利用しています。 社員マスタサブフォームがあり、レコードソースは社員履歴QUE(社員履歴TBL、所属TBL)です。 社員コード 開始日 終了日 社内区分 所属コード 役職名 内線電話番号 呼出詳細 所属名 部署名 を入力していて、以下がコードです。 Sub Form_Load() On Error GoTo Form_Load_Err If ParentFormIsOpen() Then Forms![社員マスタFRM]!ToggleLink = True Form_Load_Exit: Exit Sub Form_Load_Err: MsgBox Error$ Resume Form_Load_Exit End Sub Sub Form_Unload(Cancel As Integer) On Error GoTo Form_Unload_Err If ParentFormIsOpen() Then Forms![社員マスタFRM]!ToggleLink = False Form_Unload_Exit: Exit Sub Form_Unload_Err: MsgBox Error$ Resume Form_Unload_Exit End Sub Private Function ParentFormIsOpen() ParentFormIsOpen = (SysCmd(acSysCmdGetObjectState, acForm, "社員マスタFRM") And acObjStateOpen) <> False End Function Private Sub 終了_Click() On Error GoTo Err_終了_Click DoCmd.Close Exit_終了_Click: Exit Sub Err_終了_Click: MsgBox Err.Description Resume Exit_終了_Click End Sub 終了日を入力したら次のレコードの開始日に終了日の翌日が自動的に入力されるようにしたいです。 宜しくお願いします!!