【Access】年度ごとの自動採番のやり方(VBA)

スポンサーリンク

Accessで採番テーブルを使用して年度ごとの自動採番する方法について紹介したいと思います。
こちらは主に請求書や見積書等にそれぞれ一意のID(コード)を採番したい時に使用します。

共有DBに採番テーブルを作成して、それを使用して採番処理をVBAで行えば
一意のコードを自動生成することが可能となります。

スポンサーリンク

採番テーブルを作成する

まずは採番テーブルを作成します。
用途により必要な項目を定義していきます。
今回は、年度により切替される採番テーブルを作成しました。

採番ルールを考えます

1:請求ID →”SQ” & 年(2桁) & “-” & 0001~自動採番
2:入金ID →”NK” & 年(2桁) & “-” & 0001~自動採番

テーブル名:t_saiban
(項目)
saiban_id:オートナンバー
saiban_div:数値型
nendo:短いテキスト
 フィールドサイズ:4
備考:西暦yyyy
new_id:数値型
no:短いテキスト
 フィールドサイズ:10
note

データイメージ

画面を作成する

テキスト1
名前:txt請求ID

テキスト2
名前:txt入金ID

ボタン1
名前:cmd採番請求ID

ボタン2
名前:cmd採番入金ID

VBA

標準モジュールに下記のコードを記載します

Option Compare Database
Option Explicit

Public Const C_SAIBAN_請求ID = 1
Public Const C_SAIBAN_入金ID = 2

CONSTは定数といって変更することのない固定の値です。

採番テーブルより新IDを取得する

Rem ----------------------------------------------------------------------------------
Rem     関数名   : getNewId
Rem     処理内容 : 採番テーブルより新IDを取得
Rem     引  数  : なし
Rem     戻り値  : 新台帳ID
Rem ----------------------------------------------------------------------------------
Public Function getNewId(pSaiban_div As Integer, pNendo As String) As String
Dim objRs As Recordset
Dim strSql As String
Dim strNo As String
Dim newId As Long

On Error GoTo Error

    ' SQL実行
    strSql = "SELECT * FROM t_saiban"
    strSql = strSql & " WHERE saiban_div = " & pSaiban_div & " "
    strSql = strSql & " AND nendo = '" & pNendo & "'"
    
    Set objRs = CurrentDb.OpenRecordset(strSql, dbOpenDynaset)
    
    If objRs.RecordCount = 1 Then
        ' データがある時はIDをカウントアップ
        newId = Nz(objRs.Fields("new_id"), 0) + 1
        
        '-------------------------------------------------------
        ' 1:請求ID    →"SQ" & 年(2桁) & "-" & 0001~自動採番
        ' 2:入金ID    →"NK" & 年(2桁) & "-" & 0001~自動採番
        '-------------------------------------------------------
        Select Case pSaiban_div
            Case C_SAIBAN_請求ID
                strNo = "SQ" & Right(pNendo, 2) & "-" & funSetEditCode(STR(newId), 4)
            Case C_SAIBAN_入金ID
                strNo = "NK" & Right(pNendo, 2) & "-" & funSetEditCode(STR(newId), 4)
            Case Else
        End Select
        
        objRs.Edit
        objRs!new_id = newId
        objRs!No = strNo
        objRs.Update
    Else
        ' データがない時は新規に採番(年度変わった時)
        newId = 1
        
        objRs.AddNew
        objRs!saiban_div = pSaiban_div
        objRs!nendo = pNendo
        objRs!new_id = newId
        
        '-------------------------------------------------------
        ' 1:請求ID    →"SQ" & 年(2桁) & "-" & 0001~自動採番
        ' 2:入金ID    →"NK" & 年(2桁) & "-" & 0001~自動採番
        '-------------------------------------------------------
        Select Case pSaiban_div
            Case C_SAIBAN_請求ID
                strNo = "SQ" & Right(pNendo, 2) & "-" & funSetEditCode(STR(newId), 4)
            Case C_SAIBAN_入金ID
                strNo = "NK" & Right(pNendo, 2) & "-" & funSetEditCode(STR(newId), 4)
            Case Else
        End Select
        
        objRs!No = strNo
        objRs.Update
    End If
    
    ' 後処理
    objRs.Close: Set objRs = Nothing
    
    
    getNewId = strNo

Exit Function
Error:
    MsgBox "エラーが発生しました。エラー内容:" & Err.Description & Chr$(10), vbCritical, "ID取得"
End Function

採番テーブルより現在のIDを取得


Rem ----------------------------------------------------------------------------------
Rem     関数名   : getSaibanId
Rem     処理内容 : 採番テーブルより現在のIDを取得する
Rem     引  数  : なし
Rem     戻り値  : ID
Rem ----------------------------------------------------------------------------------
Public Function getSaibanId(pSaiban_div As Integer, pNendo As String) As String
Dim objRs As Recordset
Dim strSql As String
Dim strNo As String
Dim saibanId As Long

On Error GoTo Error

    ' SQL実行
    strSql = "SELECT * FROM t_saiban"
    strSql = strSql & " WHERE saiban_div = " & pSaiban_div & " "
    strSql = strSql & " AND nendo = '" & pNendo & "'"
    Set objRs = CurrentDb.OpenRecordset(strSql, dbOpenDynaset)
    
    If objRs.RecordCount = 1 Then
        saibanId = Nz(objRs.Fields("new_id"), 0)
        
        Select Case pSaiban_div
            Case C_SAIBAN_請求ID
                strNo = "SQ" & Right(pNendo, 2) & "-" & funSetEditCode(STR(saibanId), 4)
            Case C_SAIBAN_入金ID
                strNo = "NK" & Right(pNendo, 2) & "-" & funSetEditCode(STR(saibanId), 4)
            Case Else
        End Select
    End If
    
    ' 後処理
    objRs.Close: Set objRs = Nothing
    
    getSaibanId = strNo

Exit Function
Error:
    MsgBox "エラーが発生しました。エラー内容:" & Err.Description & Chr$(10), vbCritical, "ID取得"
End Function

コードを0埋め編集して返却

Rem ----------------------------------------------------------------------------------
Rem     関数名   : funSetEditCode
Rem     処理内容 : コードを0埋め編集して返却します
Rem     引  数  : code   = 編集前のコード
Rem                lenCnt = 桁数
Rem     戻り値  : 編集結果
Rem ----------------------------------------------------------------------------------
Public Function funSetEditCode(code As String, lenCnt As Integer) As String
On Error GoTo Error
        
    If Nz(code) = "" Then
        funSetEditCode = ""
        Exit Function
    End If
    
    funSetEditCode = Format(code, String(lenCnt, "0"))

Exit Function
Error:
    MsgBox "エラーが発生しました。エラー内容:" & Err.Description & Chr$(10), vbCritical, "0埋め編集"
End Function

画面表示

フォームの開くイベントを表示します。

Private Sub Form_Open(Cancel As Integer)

    ' 請求IDを取得
    Me.txt請求ID.Value = getSaibanId(C_SAIBAN_請求ID, "2024")
    
    ' 入金IDを取得
    Me.txt入金ID.Value = getSaibanId(C_SAIBAN_入金ID, "2024")

End Sub

請求ID採番

請求ID採番ボタンのクリックイベントに記載します。

Private Sub cmd採番請求ID_Click()
    
    ' 請求IDを採番して再セットする
    Me.txt請求ID.Value = getNewId(C_SAIBAN_請求ID, "2024")
    
End Sub

動きを確認

画面表示時

請求IDのボタンを押下

getNewId関数がコールされて採番テーブルより該当のIDを取得し
請求IDの場合は、その所定のルールにあうように採番処理をしてIDが返却されるので
それを画面のテキストに再表示しています。

コメント

タイトルとURLをコピーしました