
宜しくお願いします。
仕様環境: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)出てきません、これは何か違いがあるのでしょうか?
教えてください、宜しくお願いします。
No.1ベストアンサー
- 回答日時:
(1)
はずしていたらごめんです。
見積り番号 = Right(Format(Date, "yyyy", 2), 2) & "-" & Format(DMax("Right(見積り番号,4)", "案件") + 1, "AA
-" & "0000")
(2)
>また余談ですが、DMAX関数とDBMAX関数の違いがわかりません、
私も知りません。ヘルプにも出てきません。
逆にどこにあります?
この回答への補足
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
No.4
- 回答日時:
>番号を進まない時があります
ひょっとして「案件テーブル」の
見積り番号の更新、あるいは
レコードの追加がうまく行われなかった
ということが一番の現象の発端で、
これがどこに由来するかは、
プログラムなのか、全体の
イベントの流れなのか、
あるいはファイルの肥大によるもの
なのかはわかりません・・・・、
ということも考えられます。
この回答への補足
piroin654 様
仰るとおりです。
ただ、ファイルの肥大はちょっと考えずらいところもあります。
テストでDBを作ったので、最大でも30件ぐらいレコードの
テーブル(1個)、そしてフォームも一つだけです。
現時点でレコードが大幅に増やすと逆に面倒になるので(笑)。
ある程度レコードが増えたら、一旦テーブルから全削除してますね。
まず、「仕組みをしっかりしてから」って感じですかね。
ありがとうございます。
No.3
- 回答日時:
式が複雑で計算に矛盾が生じて、という
ことでもないようなのですが、プログラム
の書き換えなどでファイルが大きくなった
ときに、ときたまデータの表示がおかしく
なることは経験したことはあります。
最適化などで対応できるならば、という
ことも提案できます。
見積り番号の取得をコードで、また違う
方法でしてみるというのもこのような
現象を回避できる方法になり得るかも
しれません。
また、質問のマクロを実行するイベント
にマクロをVBAコードとして挿入し、イベントの
流れを確認しながらデバックしていけば
どこがネックになっているかも確認できる
のではとおもいます。
そのときに、質問の見積り番号の取得に関しても
一度に取得しないで、分解して変数に格納し、
改めてセットして取得をするという方法で
滞るポイントを探すということもいいのでは
とおもいます。
いろいろな場面でのデバッグはこのような
ことをしばしば行います。
ときには、
Debug.Print 変数(または関数の戻り値) & ("何とか")
のようにして変数の変化を確認することも
します。
質問欄に提示されたマクロを書けるならば
VBAはそれほどむかしくないと思います。
マクロを作ってはコードに変換し、なるほど
こう書くのかと覚えることも一つの方法
です。VBAでは条件分岐(If、SELECT CASE
など)の制御法、検索などのやりかたを
おぼえると、あとは楽なものです。
プロパティ、オブジェクトの制御などは
その都度ヘルプやオブジェクトブラウザ
で確認すればいいものです。私もオブジェクト
の性質やプロパティはいちいちおぼえていません。
どうしてもマクロのほうが、というものは
一つか二つくらいですし、むしろコードで制御
する方向をめざしたほうが今後にもいいと
思います。VBAは言葉をおぼえるときと
同じで、簡潔なものの集まりと"てにをは"
の使い方です。
肝心なことからずれてしまいました。
No.2
- 回答日時:
たぶん、おそらく、なんとなく、
http://okwave.jp/qa/q3932046.html
ここのことですか? 自作関数ですね。
DMAXが遅いから作ったということですが。
試していないのでわかりません。
DMAXの代替関数はいろいろ作られて
います。
アルゴリズム、検索などで
ググるとさまざまなデータの検索
方法が出てくると思います。それらの
アルゴリズムをAccessで使える手段を
利用して最適な関数を作って実現する
というのも一つの方法です。C言語などを学習
するときには必ず出くわす分野であり、
重要な分野です。
これ以上はやめておきます。興味が
あったら調べてみてください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) VBAで最新のデータを別シートに転記する方法をお教えください。 3 2022/04/07 19:20
- Access(アクセス) Access IF文でテーブルに存在しない場合の処理について 2 2022/10/10 18:09
- Visual Basic(VBA) excel2021で実行できないマクロ。どこを直したらいいのか 2 2022/03/28 03:40
- Visual Basic(VBA) 【VBA】Excelで罫線を引きたい 3 2022/07/14 12:04
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Visual Basic(VBA) Changeイベントで複数セルへの貼り付けおよび値削除時に1個目のセルのみエラーになる 3 2022/12/21 09:07
- Excel(エクセル) 製品番号での整列と、検索に関して 3 2023/06/28 19:20
- Access(アクセス) Access DLookup vbaで条件を2件設定したい場合どうすればよいでですか? 現在 If( 1 2023/06/28 14:28
- Access(アクセス) Accessでセレクタをダブルクリックで別フォームで詳細表示 3 2022/12/20 10:36
このQ&Aを見た人はこんなQ&Aも見ています
-
access 自動採番 年が変わるごとに0001に戻る仕組み。
その他(データベース)
-
ACCESSで日付ごとに自動連番(日付+連番)する方法
Access(アクセス)
-
accessでオートナンバーを使わずに「文字+数字」の自動採番する方法
Access(アクセス)
-
-
4
Accessで日付が変わると番号がリセットされる自動採番がしたい
Access(アクセス)
-
5
レコードを保存するコード アクセスvba
その他(Microsoft Office)
-
6
Access テキスト型に対する指定桁での0埋め方法
その他(データベース)
-
7
ACCESSの自動連番について
Access(アクセス)
-
8
ACCESSでオートナンバーを任意の書式で付けたい
Access(アクセス)
-
9
文字を含むIDの自動採番
その他(Microsoft Office)
-
10
accessでの文字列の混ざった連番処理について
Access(アクセス)
-
11
Accessを開きなおすとテキストボックスの値がエラー#Name?になる
その他(データベース)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Accessで別テーブルの値をフォ...
-
[Access]異なるレコード間の文...
-
最新の日付とその金額をクエリ...
-
【SQL】existsでの商演算
-
アクセスで挿入時のVALUES以下...
-
Access:抽出して、色をつけたい。
-
【アクセスVBA】テーブルにフィ...
-
MS Accessの抽出方法につ...
-
MS Accessで行指定検索の方法
-
条件をつけて日付の古い行を抜...
-
sqlで質問です。 Aテーブルの登...
-
質問です。 下記のテーブルとデ...
-
access 自動採番 「10-AA-000...
-
【Access】選択クエリのグルー...
-
Oracleでの文字列連結サイズの上限
-
GROUP BYを行った後に結合した...
-
OracleのSQL*PLUSで、デー...
-
レコードが存在しなかった場合
-
oracleの分割delete
-
select insertで複数テーブルか...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Accessで別テーブルの値をフォ...
-
最新の日付とその金額をクエリ...
-
【アクセスVBA】テーブルにフィ...
-
access 自動採番 年が変わる...
-
Accessで日付が変わると番号が...
-
Accessでのレコード存在チェック
-
Recordset.FindFirstについて
-
vba 直前の操作はキャンセルさ...
-
access 自動採番 「10-AA-000...
-
Access 文字+年ごとの自動採番
-
アクセスで「空き番」の確認
-
[Access]異なるレコード間の文...
-
条件をつけて日付の古い行を抜...
-
【Access】選択クエリのグルー...
-
Access:抽出して、色をつけたい。
-
ACCESSでの行番号の自動採番
-
Access VBAで更新履歴を追いたい
-
sqlで質問です。 Aテーブルの登...
-
Oracle 8i に入っている値が、...
-
質問です。 下記のテーブルとデ...
おすすめ情報