質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Q&A

解決済

1回答

6673閲覧

採番テーブルを使用し、入力フォームで自動採番できるようにしたい

退会済みユーザー

退会済みユーザー

総合スコア0

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

0グッド

0クリップ

投稿2019/06/03 01:53

編集2019/06/03 05:12

###質問内容

Access初心者です。

私は今、Accessで売上伝票管理システムを作成しています。

作成していく上で、顧客入力、担当者入力、商品入力etc
各入力フォームを作成しているのですが、そのフォームで番号を入力するテキストボックスがあります。
顧客番号、担当者番号、商品番号etc

その番号をVBAで自動採番するようにしたいです。

###概要
<採番テーブル>

列名データ型備考
F_NumCodeテキスト型採番コード(000000-999999)の範囲を格納 (主キー)
F_MgtCode長整数型採番値を格納
F_Min長整数型最小値
F_Max長整数型最大値
F_Formatテキスト型フォーマットする(000000)

のように作成してあります。

これを使って連番?採番?を各入力フォームでされるようにしたいです。
わかる方いましたら教えてくださると幸いです。

よろしくお願いします。

###追記・補足

最終的な結果としては、
フォームを開くと自動的に000001といった風に入っているようにしたいです。
次回開くと000002

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2019/06/03 02:15

オートナンバーが楽だと思いますが、採用しない理由はありますか?
退会済みユーザー

退会済みユーザー

2019/06/03 02:20

私も調べてそちらの方が楽だと思ったのですが、課題のテーブル定義でこちらのやり方を指定されているので、、、 といった理由です。
sazi

2019/06/03 02:39 編集

そのフォームは新規のみのフォームですか? 自動採番する場合に関係して、「番号を入力するテキストボックス」の扱いは? (新規なら入力しないのでは?)
退会済みユーザー

退会済みユーザー

2019/06/03 02:39

新規入力フォームのみです。 そうですね、やや語弊ががありました。すみません。 新規に入力するときに、フォームを開くと番号のテキストボックスにはすでに「000001」のように表示されているようにしたいです。
sazi

2019/06/03 02:49 編集

F_MgtCodeの用途は何ですか?(F_Max+1が格納されるのですか?) F_Formatはフォーマット用の書式が格納されるのですか? F_Min及びF_MaxがF_MgtCodeの取りうる値の範囲だった場合、その範囲を超える場合も考慮するのですか?
退会済みユーザー

退会済みユーザー

2019/06/03 04:28

F_MgtCodeは、フォーマットする前の1とか2とか3の数値を格納し、それをフォーマットして、最終的に「000001」や「000002」の形にして表示する感じです。 考慮します。
hatena19

2019/06/03 05:58

複数のユーザーで共有して運用するものでしょうか。 それとも、シングルユーザーによる運用でしょうか。
退会済みユーザー

退会済みユーザー

2019/06/03 06:01

あくまで課題ですので実際に運用はしませんが、シングルで考えているものです。
hatena19

2019/06/03 06:21

シングルユーザーなら、わざわざ採番用のテーブルを用意せずに、 顧客、担当者、商品 のそれぞれのテーブルの主キーの最大値+1を取得すればいいだけです。DMax関数で最大値は簡単に取得できます。 課題で、実際に運用しないって、学生さん?
退会済みユーザー

退会済みユーザー

2019/06/03 06:25

いえ、このテーブルで指定されているので。そちらのやり方の方が簡単だとは思いますが。 ちなみに社会人でこれは研修課題みたいなものです。
guest

回答1

0

ベストアンサー

F_NumCode<採番テーブル>のキーで、顧客番号、担当者番号、商品番号等のどの番号の情報なのかを識別するものだと思います。

番号を取得するには

VBA

1Dim wFormat As String, wMgtCode As Long 2wFormat = DLookUp("F_Format","採番テーブル","F_NumCode=[対象の採番コード]") 3wMgtCode= DLookUp("F_MgtCode","採番テーブル","F_NumCode=[対象の採番コード]") 4[番号のテキストボックス]=Format(wMgtCode, wFormat)

登録により入力が確定した場合には、更新クエリー等により、F_MgtCode+1する必要があります。
但し、それがF_Maxを超えた場合は、番号をリサイクルする仕様ならF_Minに置き換える必要があります。

尚、番号を管理する場合、管理するデータが削除されていく仕様でない限りリサイクルは行いません。

また、採番テーブルは初期データが登録されている前提です。
※一度も採番されていない場合はF_MgtCode=F_Minの状態。

追記

サンプルとして作るとしたらの例を挙げておきます。

  • T_Num
F_NumCodeF_MgtCodeF_MinF_MaxF_Format
顧客11999999000000
担当者11999999000000
商品11999999000000
  • 上記を元に顧客番号の新規採番を取得するコードは

VBA

1Dim wFormat As String, wMgtCode As Long 2wFormat = DLookUp("F_Format","T_Num","F_NumCode='顧客'") 3wMgtCode= DLookUp("F_MgtCode","T_Num","F_NumCode='顧客'") 4[番号のテキストボックス]=Format(wMgtCode, wFormat)
  • 次回用の採番番号の設定

登録が確定するタイミング(登録ボタンなどのイベント)で

VBA

1CurrentDB.ExeCute "update T_Num set F_MgtCode = F_MgtCode + 1 where F_NumCode='顧客'"

投稿2019/06/03 03:01

編集2019/06/03 06:50
sazi

総合スコア25195

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/06/03 04:24

回答ありがとうございます! お手数ですが、もう少し詳細な情報をお教えしてほしいです。。
sazi

2019/06/03 04:31 編集

詳細とは何についてですか? 課題と言われているので、ヒント的なものに敢えて留めるようにしました。 それを抜きにしても、回答できるのは希望される詳細と言われるレベルによりますけど。
退会済みユーザー

退会済みユーザー

2019/06/03 05:00 編集

>登録により入力が確定した場合には、更新クエリー等により、F_MgtCode+1する必要があります。 但し、それがF_Maxを超えた場合は、番号をリサイクルする仕様ならF_Minに置き換える必要があります。 ↑この部分がまだちょっとわからないのです。 度々すみません。
sazi

2019/06/03 04:39

質問にコメントしましたが、 > F_Min及びF_MaxがF_MgtCodeの取りうる値の範囲だった場合、その範囲を超える場合も考慮するのですか? については、どのような仕様なんですか?
sazi

2019/06/03 04:40

課題とありましたけど、採番テーブルのに関する仕様をあなたが理解していなければ、的確な回答にはなりません。
退会済みユーザー

退会済みユーザー

2019/06/03 04:52

そうですね。正直、「こういった感じにしたい」という結果は見えているのですが、このテーブルの仕様については、私もまだ100%理解はしていない状態でして、、、 的確な答えでなくても、アドバイス程度でなにかヒントになるような事を教えてくださると幸いです。
sazi

2019/06/03 04:57 編集

ヒントのつもりなのです。 分からないところを具体的にしてもらえないと、答え辛いのです。
sazi

2019/06/03 05:00 編集

更新クエリーの内容をそのまま回答に追記して分かってもらえますか? あなたのレベルも探りながら回答しています。 更新クエリーができたとしてそれをどのように実行するか、実装方法は思い浮かびますか?
退会済みユーザー

退会済みユーザー

2019/06/03 05:04

恥ずかしながら、更新クエリーとはまずなんなのか、私はまだその段階なのです。。 Me.Requeryみたいのとはちがいますよね??
sazi

2019/06/03 05:12

うーん。ここは学習サイトではないですからね。 全部わからないというレベルで質問する場所では無いですよ。 全部とまでは言わないまでも、どの程度理解されているかは分かりませんから。 課題と言われるなら、その課題を出した人に確認するのが最も効率的です。
退会済みユーザー

退会済みユーザー

2019/06/03 05:15

そうですよね。いろいろ答えてくださり、ありがとうございました。 参考にしてまた自分で考えてみます。
sazi

2019/06/03 05:16

> フォームを開くと自動的に000001といった風に入っているようにしたいです。 フォームを開くときのイベントで、回答したコードを実行して下さい。
退会済みユーザー

退会済みユーザー

2019/06/03 05:21

度々すみません。 [対象の採番コード]とはどいったものでしょうか?
sazi

2019/06/03 05:27 編集

顧客番号、担当者番号、商品番号などのどの番号なのかを識別するコードが、F_NumCodeに与えられていると推測していて、そのコード値です。 採番テーブルは空のテーブルなんでしょうか? 使い方として初期値データがあると思うのですが。 採番テーブルのサンプルデータも質問に追記されると、具体的にしやすくなります。
退会済みユーザー

退会済みユーザー

2019/06/03 05:27 編集

'---------------------------- 'フォームを開いたとき '---------------------------- Private Sub Form_Open(Cancel As Integer) Select Case Me.OpenArgs Case "追加" Me.Caption = "新規追加" Me.Label_CustomerInput.Caption = "新規追加" Me.Button_Add.Caption = "追加" Dim wFormat As String Dim wMgtCode As Long wFormat = DLookup("F_Format", "T_Num", "F_NumCode = 000001") wMgtCode = DLookup("F_MgtCode", "T_Num", "F_NumCode = 000001") F_CustomerCode = Format(wMgtCode, wFormat) Case "編集" Me.Caption = "顧客編集" Me.Label_CustomerInput.Caption = "顧客編集" Me.Button_Add.Caption = "編集" End Select End Sub こういった感じでしょうか
sazi

2019/06/03 05:33

何でしょう?コード貼り付けられたというのはエラーか何かですか? 分かりませんけど、取りあえず、F_NumCode はテキスト型なので、(')を付加して下さい。 wFormat = DLookup("F_Format", "T_Num", "F_NumCode = '000001'") wMgtCode = DLookup("F_MgtCode", "T_Num", "F_NumCode = '000001'")
sazi

2019/06/03 05:37

それから、メニュー → ツール → オプション → 編集タブ 「変数の宣言を強制する」にチェックを入れておいた方が良いです。 コードでみると先頭に「Option Explicit」が強制されます ※ないなら追記して下さい。
退会済みユーザー

退会済みユーザー

2019/06/03 05:37

いや、ただこんな感じかなっていうのを見てほしかっただけです。 実行時エラーでNullの使い方が不正です とでてしまいます。
退会済みユーザー

退会済みユーザー

2019/06/03 05:40

メニューがどこにあるか見当たらないです。。
sazi

2019/06/03 05:41 編集

回答やコメントで何回も記述していますが、採番テーブルが空ならエラーになります。 採番テーブルが空の場合を考慮するところから始めないといけない仕様なのですか?
sazi

2019/06/03 05:42

VBA操作するウインドウのメニューです。
退会済みユーザー

退会済みユーザー

2019/06/03 05:42

すみませんやっと理解しました。 そういった仕様のようです。
退会済みユーザー

退会済みユーザー

2019/06/03 05:44

ありがとうございます。 チェックはいれました。
sazi

2019/06/03 05:45

>そういった仕様のようです。 あり得ません。 F_Min,F_MAX,F_Formatは定義されるものでしょう? プログラムで埋め込むとしても、設定用のプログラムとか別な話です。
sazi

2019/06/03 05:48

> チェックはいれました。 新規にフォームとか標準モジュールを作成するときにしか、適用されませんので、それは今後の為の事です。 現状は、Option Explicitを追記です。
退会済みユーザー

退会済みユーザー

2019/06/03 05:51

そもそもテーブルが空っていうのはどういうことですか?? なにもレコードが入っていないということでしょうか?
退会済みユーザー

退会済みユーザー

2019/06/03 05:52

>新規にフォームとか標準モジュールを作成するときにしか、適用されませんので、それは今後の為の事です。 現状は、Option Explicitを追記です 了解しました!
sazi

2019/06/03 05:58 編集

> そもそもテーブルが空っていうのはどういうことですか?? コードで言うなら、F_NumCode = '000001'のデータが無いという事です。 データがあるならそれを質問に追記して下さい。こちらでは分かりません。
退会済みユーザー

退会済みユーザー

2019/06/03 06:04

そういうことでしたらデータはありません。
sazi

2019/06/03 06:10 編集

ないなら、ご自身で想定して作るしかありませんね。 回答して動くようになっても、それは、あなたの学習における、悩んで結果を導き出す事、という重要なプロセスを阻害する事にしかなりませんので、コメントするのはそろそろ控えておきます。
退会済みユーザー

退会済みユーザー

2019/06/03 06:10

わかりました。頑張ってみます。 長々とコメントありがとうございました。
sazi

2019/06/03 06:22

最後にお節介を追記しておきました。
退会済みユーザー

退会済みユーザー

2019/06/03 06:27

いえいえ、とても助かります!しっかり参考にさせていただきます。 本当にありがとうございました。
sazi

2019/06/03 06:38

解決した場合は忘れずにクローズして下さいね。
退会済みユーザー

退会済みユーザー

2019/06/03 06:40

クローズとは??
sazi

2019/06/03 06:41

解決済みにする事です。
退会済みユーザー

退会済みユーザー

2019/06/03 06:43

承知しました。
sazi

2019/06/03 06:44

あんまり覚えてないんですが、ベストアンサー選ぶか自己解決で解決済みになったと思います。
退会済みユーザー

退会済みユーザー

2019/06/04 00:13

上記のサンプルを参考にやっていたところ、おおよそはできてきたのですが、どうしても最後の [番号のテキストボックス]=Format(wMgtCode, wFormat) この部分で「このオブジェクトには代入できません」 とエラーがでてしまいました。 ↑これってどういうことなんでしょう
sazi

2019/06/04 01:23 編集

それはそのフォームの作りに関わってきます。 新規に非連結(コントロールソースに指定なし)のテキストボックスを追加してそこに代入して試してみて下さい。
退会済みユーザー

退会済みユーザー

2019/06/04 00:34

ちゃんとできました! ありがとうございます。
sazi

2019/06/04 00:46

多分連結フォームと思いますから、本来の番号項目への項目移送も必要です。 新規に追加したもので確認できたとしてもそれは表示されたというだけです。 フォームの話になるなら、別質問でお願いします。
退会済みユーザー

退会済みユーザー

2019/06/06 04:07

追加質問すみません。 ちなみにこの方法で欠番にならないようにできますか? 000001 000002 000003  とあり、000002のデータを削除した場合、000003がひとつ繰り上がって 000001 000002 というようにすることは可能でしょうか?
sazi

2019/06/06 04:15

意味のある番号(ナチュラルキー)であれば別ですけど、意味のない(サロゲートキー)の場合は振り直しは考えないのが普通です。 出来ないというわけではなく、その番号でリレーションしている他のテーブルも合わせて変更しなければなりませんので。 リレーションシップで参照整合性を設定すればプログラムレスにはなります。
退会済みユーザー

退会済みユーザー

2019/06/06 04:22

普通のマスタの連番の時は上記のもので大丈夫なのですが、 伝票入力のフォームにある、複数のデータを追加する用のサブフォームに使う行番号の時にも採番を使いたいと思いまして。
退会済みユーザー

退会済みユーザー

2019/06/07 05:46

資料提供ありがとうございます。 目を通してみましたが、若干やりたいことが異なるところがあるため、新しく質問を募集します。
sazi

2019/06/07 05:53

サブフォームの行番号に明細の採番は使えないですよ。 なぜなら、伝票番号ごとに明細番号が1から始まらないと駄目なので、伝票番号ごとのデータが必要になるからです。
退会済みユーザー

退会済みユーザー

2019/06/07 06:05

上記とはまた別の方法になってくるということですよね。
sazi

2019/06/07 06:32

そういう意味で採番ではなく連番表示をお薦めしています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問