広告

オートナンバー型フィールドの連番カウンターをリセットする方法2種(通常テーブル&リンクテーブル)

通常のテーブル

  • 通常(自DB内)のテーブルの場合は、SQLの「ALTER TABLE」&「ALTER COLUMN」で。
Sub オートナンバー付テーブルのリセット()
'対象テーブル名「T_Data」
'オートナンバー型フィールド名「連番
Dim strSQL As String

DoCmd.SetWarnings False
  '■全レコード削除
  strSQL = "DELETE FROM T_Data;"
    DoCmd.RunSQL strSQL
  '■カウンターのリセット
    strSQL = "ALTER TABLE T_Data ALTER COLUMN 連番 COUNTER(1,1);"
  'COUNTERの後の()内は、(初期値,カウントアップ単位数)を表す。
  '10番刻みなどにもできる(←未だかつて使う機会が無くて残念)
    DoCmd.RunSQL strSQL
DoCmd.SetWarnings True

End Sub

リンクテーブル

  • リンクテーブルだと、上記の手は使えません。ためしにやってみると…
実行時エラー 3611 リンクされているデータソースに対してデータ定義ステートメントを実行することはできません。
  • テーブル定義をいじるには、そのテーブル本体が格納されているDBを開いて操作する必要があるので、DAOを使ってリンク先のDBを開いてから、「ALTER TABLE」&「ALTER COLUMN」作戦が必要になります。
Sub リンクテーブルのリセット()
'リンクテーブル名「T_Data」
'リンクテーブル上のオートナンバー型フィールド名「連番

Dim DB As DAO.Database
Dim Tbl_D As DAO.TableDef
Dim strPath As String
Dim strSQL As String

'■自DBに接続し、リンクテーブル「T_Data」のテーブル定義を取得
Set DB = CurrentDb
Set Tbl_D = DB.TableDefs("T_Data")

  '「T_Data」のテーブル定義から接続情報を採取
    strPath = Tbl_D.Connect 
    '(変数strPathの値は「;DATABASE=リンク先DBのフルパス」になっている)

    '相方(リンク先)DBのフルパス部分をMid関数で取得する
    strPath = Mid(strPath, InStr(strPath, ";DATABASE=") + Len(";DATABASE="))
    '(変数strPathの値は「リンク先DBのフルパス」のみになる)
    '【豆知識】Mid関数は最後の引数(取り出す文字数)を省略すると
    ' 取出し開始位置以降全ての文字列を取って来る
    
Set Tbl_D = Nothing
Set DB = Nothing

'■フルパス情報を使って相方のDBに接続
Set DB = OpenDatabase(strPath)

DoCmd.SetWarnings False    
    'リンクテーブルのレコードを全削除
    strSQL = "DELETE * FROM T_Data;"
    DB.Execute strSQL
    'オートナンバーフィールドのカウンターをリセット
     strSQL = "ALTER TABLE T_Data ALTER COLUMN 連番 COUNTER(1,1);"
    DB.Execute strSQL
DoCmd.SetWarnings True
    
    DB.Close
Set DB = Nothing

MsgBox "リンクテーブル「T_Data」の全レコードを削除し、" & _
       "「連番」フィールドのカウンターをリセットしました。", _
       vbInformation

End Sub
  • ちなみに「ALTER TABLE T_Data ALTER COLUMN 連番 COUNTER(1,1);」の「COUNTER(1,1)」のところを「COUNTER(10,10)」(初期値10,増分10)に変えてみると、こんな連番が付与できます。