宜しくお願いします。
仕様環境: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 文字+年ごとの自動採番
その他(データベース)
-
-
4
ACCESSで日付ごとに自動連番(日付+連番)する方法
Access(アクセス)
-
5
accessでオートナンバーを使わずに「文字+数字」の自動採番する方法
Access(アクセス)
-
6
Accessで日付が変わると番号がリセットされる自動採番がしたい
Access(アクセス)
-
7
文字を含むIDの自動採番
その他(Microsoft Office)
-
8
Accessで、固定アルファベット+オートナンバーを表示する
Excel(エクセル)
-
9
access 請求番号の自動採番
その他(データベース)
-
10
ACCESSの自動連番について
Access(アクセス)
-
11
Accessで値がnullの場合は計算せずにnullをかえす方法
Access(アクセス)
-
12
オートナンバー型を抽出条件にするとき
Visual Basic(VBA)
-
13
「#エラー」の回避
Access(アクセス)
-
14
アクセスで数値型のフィールドにNullをいれたい
その他(データベース)
-
15
Access 複数フォームを開き、画面の最上面にしたいフォームをコント
その他(データベース)
-
16
accessの自動更新処理をできないようにするにはどうすれば良いですか?
その他(データベース)
-
17
レコードを保存するコード アクセスvba
その他(Microsoft Office)
-
18
ラベルとテキストボックスのグループ化を解除したい
Access(アクセス)
-
19
access2019 チェックボックスと連動したクエリ抽出条件について
Access(アクセス)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Accessで別テーブルの値をフォ...
-
【SQL】existsでの商演算
-
SQL文で右から1文字だけ削除す...
-
カレントレコードが無い事を判...
-
ファイル書込みで一行もしくは...
-
実績累計の求め方と意味を教え...
-
複数テーブルのMAX値の行データ...
-
アクセス クエリ-で空白以外の...
-
複数の表の条件でのDELETE文
-
【初歩】ラジオボタンをつかっ...
-
Excelで、改行がある場合の条件...
-
集計後の数値が倍になる
-
【MYSQL】asでリネームしてwher...
-
SQLについて質問です。 AVG関数...
-
DataGridViewの内容をDBに反映...
-
ワードの差込印刷で教えて下さ...
-
OracleのSQL*PLUSで、デー...
-
データグリッドのセルにtex...
-
アクセスでレポートの1印刷内...
-
月別、販売員別の集計がわかり...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Accessで別テーブルの値をフォ...
-
Accessで日付が変わると番号が...
-
Accessでのレコード存在チェック
-
最新の日付とその金額をクエリ...
-
SELECT * FROM `生徒名簿` INNE...
-
access 自動採番 年が変わる...
-
〜のような結果を出すためのSQL...
-
【アクセスVBA】テーブルにフィ...
-
access 自動採番 「10-AA-000...
-
Access:抽出して、色をつけたい。
-
アクセスで「空き番」の確認
-
access 請求番号の自動採番
-
[Access]異なるレコード間の文...
-
条件をつけて日付の古い行を抜...
-
Access 文字+年ごとの自動採番
-
【SQL】existsでの商演算
-
【Access】選択クエリのグルー...
-
vba 直前の操作はキャンセルさ...
-
access2003で学籍番号から生徒...
-
質問です。 下記のテーブルとデ...
おすすめ情報