- ベストアンサー
access 自動採番 「10-AA-0001」にするには
- accessの自動採番機能を使用して、「10-AA-0001」という番号を作成したい場合の方法について教えてください。
- 現在、自動採番で「AA-0001」という番号を作成することができていますが、年を示す「2010」という数字を追加して「2010-AA-0001」としたいです。また、年が変わると自動的に次の年の数字に変更されるようにしたいです。
- 現在、VBAとマクロの両方で試してみましたが、うまくいきません。DMAX関数とDBMAX関数の違いについても教えていただきたいです。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
(1) はずしていたらごめんです。 見積り番号 = Right(Format(Date, "yyyy", 2), 2) & "-" & Format(DMax("Right(見積り番号,4)", "案件") + 1, "AA -" & "0000") (2) >また余談ですが、DMAX関数とDBMAX関数の違いがわかりません、 私も知りません。ヘルプにも出てきません。 逆にどこにあります?
その他の回答 (3)
- piroin654
- ベストアンサー率75% (692/917)
>番号を進まない時があります ひょっとして「案件テーブル」の 見積り番号の更新、あるいは レコードの追加がうまく行われなかった ということが一番の現象の発端で、 これがどこに由来するかは、 プログラムなのか、全体の イベントの流れなのか、 あるいはファイルの肥大によるもの なのかはわかりません・・・・、 ということも考えられます。
補足
piroin654 様 仰るとおりです。 ただ、ファイルの肥大はちょっと考えずらいところもあります。 テストでDBを作ったので、最大でも30件ぐらいレコードの テーブル(1個)、そしてフォームも一つだけです。 現時点でレコードが大幅に増やすと逆に面倒になるので(笑)。 ある程度レコードが増えたら、一旦テーブルから全削除してますね。 まず、「仕組みをしっかりしてから」って感じですかね。 ありがとうございます。
- piroin654
- ベストアンサー率75% (692/917)
式が複雑で計算に矛盾が生じて、という ことでもないようなのですが、プログラム の書き換えなどでファイルが大きくなった ときに、ときたまデータの表示がおかしく なることは経験したことはあります。 最適化などで対応できるならば、という ことも提案できます。 見積り番号の取得をコードで、また違う 方法でしてみるというのもこのような 現象を回避できる方法になり得るかも しれません。 また、質問のマクロを実行するイベント にマクロをVBAコードとして挿入し、イベントの 流れを確認しながらデバックしていけば どこがネックになっているかも確認できる のではとおもいます。 そのときに、質問の見積り番号の取得に関しても 一度に取得しないで、分解して変数に格納し、 改めてセットして取得をするという方法で 滞るポイントを探すということもいいのでは とおもいます。 いろいろな場面でのデバッグはこのような ことをしばしば行います。 ときには、 Debug.Print 変数(または関数の戻り値) & ("何とか") のようにして変数の変化を確認することも します。 質問欄に提示されたマクロを書けるならば VBAはそれほどむかしくないと思います。 マクロを作ってはコードに変換し、なるほど こう書くのかと覚えることも一つの方法 です。VBAでは条件分岐(If、SELECT CASE など)の制御法、検索などのやりかたを おぼえると、あとは楽なものです。 プロパティ、オブジェクトの制御などは その都度ヘルプやオブジェクトブラウザ で確認すればいいものです。私もオブジェクト の性質やプロパティはいちいちおぼえていません。 どうしてもマクロのほうが、というものは 一つか二つくらいですし、むしろコードで制御 する方向をめざしたほうが今後にもいいと 思います。VBAは言葉をおぼえるときと 同じで、簡潔なものの集まりと"てにをは" の使い方です。 肝心なことからずれてしまいました。
補足
このつながりは一つにまとめました。 宜しくお願いしますm(_ _)m
- piroin654
- ベストアンサー率75% (692/917)
たぶん、おそらく、なんとなく、 http://okwave.jp/qa/q3932046.html ここのことですか? 自作関数ですね。 DMAXが遅いから作ったということですが。 試していないのでわかりません。 DMAXの代替関数はいろいろ作られて います。 アルゴリズム、検索などで ググるとさまざまなデータの検索 方法が出てくると思います。それらの アルゴリズムをAccessで使える手段を 利用して最適な関数を作って実現する というのも一つの方法です。C言語などを学習 するときには必ず出くわす分野であり、 重要な分野です。 これ以上はやめておきます。興味が あったら調べてみてください。
補足
piroin654 様 回答ありがとうございます。 結果はもう一つの方にまとめさせていただきました。
補足
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