Accessのテーブルでコードなどに、オートナンバー型を使っているとなにかと不便を感じることもあります。
番号に欠番が生じた場合、再度、番号を振りなおすのが面倒なんですね。
オートナンバーを振り直す方法はいろいろあります。
以下は、私が一番簡単だと思う方法を解説しています。
-
オートナンバー型の番号の振り直し(切り取りと貼り付けでリセット)
Accessのテーブルでフィールドのデータ型を[オートナンバー型]にして、レコードを削除すると、そのレコードは欠番になります。 以下のテーブ ...
追加クエリを使って振り直す方法もあります。
-
追加クエリを使ったオートナンバー型フィールドの番号の振り直し
オートナンバー型のあるテーブルでレコードを削除すると、欠番が出てしまいます。 Accessにとっては問題はなくても、見た目としては1から綺麗 ...
Excelにエクスポートして番号を振りなおして、再度、それをインポートする方法もあります。
オートナンバーの振り直しができても、やっぱり、できるだけ面倒なことは避けたいですよね。
オートナンバー型を使わずに自動的に連番を入力していく方法です。
いくつか方法はあるようですが、その中の1つの方法と思ってくださいね。
データ型を数値型に変更
下のような[管理テーブル]があります。[ナンバー]フィールドのデータ型は、数値型にします。
[主キー]の設定をします。
そして、[管理テーブル]を基に作成した入力用のフォームがあります。
注意フィールド名を[NO]にすると、動作しないので[NO]以外のフィールド名にしてください。
挿入前処理のイベントで設定
入力用のフォームをデザインビューで開いて、フォームセレクタ(ルーラーの左端にある□)をダブルクリックして、フォームのプロパティを表示させます。
[イベント]タブから[挿入前処理]プロパティの[ビルダー選択]ボタン[…]をクリックします。
[ビルダの選択]ダイアログボックスから[コードビルダ]を選択して[OK]ボタンをクリックします。
[マクロビルダー]で設定する方法も解説しています。
下のようにコードを書きます。
[DCount]と[DMax]の[ナンバー]は、テーブルのフィールド名です。[管理テーブル]は、テーブル名です。
[Me!]は、私自身という意味です。[Me![ナンバー]]は、フォームのテキストボックス[ナンバー]に入力するということです。
赤線の部分だけ書き直します。
管理テーブルのレコード件数を数えて、0だったら1を返して、それ以外なら管理テーブルの中で一番大きな値に1を足したものを返すというものです。
If DCount("ナンバー", "管理テーブル") = 0 Then
Me![ナンバー] = "1"
Else
Me![ナンバー] = Format(DMax("ナンバー", "管理テーブル") + 1)
End If
これでOKです。
もしも、データが入力された後なら、下のように一行だけでもいいです。 ([ナンバー]フィールドに[1]が入力された後ならという意味です。)
Me![ナンバー] = Format(DMax("ナンバー", "管理テーブル") + 1)
ビューを切り替えて、入力してみます。
ナンバーには入力しないで[所属]フィールドに選択(入力)した時点で自動的に番号が振られると思います。
マクロビルダーで設定するには
マクロアクションで設定する方法を追記しておきます。
画像は、Access2010です。
フォームをデザインビューで開いて、フォームのプロパティを表示します。
プロパティシートの[選択の種類]で[フォーム]が選択されていることを確認します。
もし、[フォーム]以外になっている場合は、▼ボタンをクリックして一覧から[フォーム]を選択するか、フォームセレクタ(ルーラーの左端にある□)をクリックすると[フォーム]が選択されます。
フォームが選択されている時のフォームセレクタは、■が表示されています。
[イベント]タブの[更新前処理]の[ビルダー選択]ボタン[…]をクリックします。
[ビルダーの選択]ダイアログボックスが表示されますので、[マクロビルダー]を選択して[OK]ボタンをクリックします。
マクロウィンドウが表示されます。
[新しいアクションの追加]の▼ボタンをクリックします。
アクションの一覧から[If]を選択します。
そして、以下のように入力します。
DCount("ナンバー","管理テーブル")=0
[デザイン]タブの[表示/非表示]グループにある[すべてのアクションを表示]ボタンをクリックします。
すぐ下にある[新しいアクションの追加]の▼ボタンをクリックして、[値の代入]を選択します。
一番下までスクロールすると、見つかります。
[値の代入]アクションの[アイテム]には、テキストボックス名を入力します。
[式]には、[1]と入力します。
入力が終わったら、[Elseの追加]をクリックします。
再度、アクションの一覧から[値の代入]を選択します。
[アイテム]にはテキストボックスの名前です。
[式]には、以下のように入力します。
DMax("ナンバー","管理テーブル")+1
以下のように完成したら、上書き保存して、マクロウィンドウを閉じます。
プロパティには、[埋め込みマクロ]と表示されます。
参考[ビルダーの選択]ダイアログボックスで[コードビルダー]を選択して、コードを記述した場合は[イベントプロシージャ]と表示されます。
コードは、以下のように省略しても動作すると思います。
If DCount("ナンバー", "管理テーブル") = 0 Then
ナンバー = 1
Else
ナンバー = (DMax("ナンバー", "管理テーブル") + 1)
End If
コードで記述するか、マクロで設定するかの違いについては、以下の記事で解説しています。
-
マクロアクション(マクロビルダー)とVBA(コードビルダー)
Accessでは、マクロアクション(マクロの実行アクション)やVBA(Visual Basic for Applications)を使って一 ...
[ナンバー]テキストボックスにカーソルが移動しないように設定
ナンバーテキストには、カーソルが移動しないようにした方がいいかもしれませんね。
[ナンバー]テキストボックスのプロパティの[データ]タブから、[使用可能]を[いいえ]、[編集ロック]を[はい]にします。
これで、ナンバーのテキストボックスにはカーソルは移動しなくなります。
ビューを切り替えて、確認してみてください。
レコードを削除して欠番を使用する場合
管理テーブルでナンバー3のレコードを削除したとします。
テーブルで新しくナンバー3を入力します。
フォームを開くと、ちゃんと並び変わっています。もちろんテーブルも昇順になります。
参考DMax関数とDCount関数については、Microsoftの記事を参照してください。
DMin、DMax 関数 - Access(Microsoft)
DCount 関数 - Access(Microsoft)
DMax関数は、以下の記事でも使用しています。
-
ファイルのバージョンが異なる場合はメッセージを表示して更新をお知らせ
Accessでデータベースを作成して、それを複数人で共有する場合、データベースを分割して、リンクテーブルがあるフロントエンド側にフォームやレ ...
以下は、DCount関数を使用した記事です。
-
レコード検索時に該当するレコードがない場合はメッセージを表示する
フォームに検索ボックス(テキストボックス)を設置して、管理番号を入力したら該当のレコードを抽出する仕組みを作ります。 その時、検索ボックスに ...
-
重複データが入力されたらオリジナルのメッセージを表示する
Accessのフォームで受付番号を入力するように作成しています。 受付番号を入力したときに、既に入力済みの番号であればメッセージウィンドウを ...
-
0を除く平均値を求めるには(Sum関数とDCount関数)
Accessでアンケート集計を作成することになりました。 各質問に[0から5]の5段階の評価をつけもらうことにしました。 ただし、[0]は、 ...
-
テーブル/クエリにレコードが1件もない時にメッセージを表示する
Accessのテーブル/クエリでレコードが1件もない時、そのテーブルを基にして作成したフォームを開こうとする場合は、[データがありません]と ...
-
重複しないデータの個数とレコードの抽出件数をテキストボックスに自動表示
Accessのフォームに重複しないデータの個数を表示する方法を紹介します。 下のようにフォームヘッダーのテキストボックスに部署数の重複しない ...
-
フィールドの同じ値の数をカウントするにはクエリでグループ化
クエリのグループ化は、グループごとに集計できる便利な機能です。 たとえば、1つのフィールド内の同じデータをグループ化して、合計やカウント、平 ...