tips
VBA
table
access
Field

Access VBA TIPS テーブルの削除 主キー列 チェックボックス ファイルの共有ロック数

テーブルの削除

既存のテーブルを削除して新たなテーブルをコピーするとき
Docmd.DeleteObjectを使う。

Db.tabledefs.delete "tablename"

で削除して

DoCmd.CopyObject , "tablename", acTable, "copysourcetable": DoEvents
Set tdf = db.tabledefs("tablename")

としようとしても、画面上はテーブルができても、テーブルがないことになるためエラーが起きる。
次のVBAを実行すると確認できる。

For each tdf in db.tabledefs
Debug.print tdf
Next

としてもテーブル:tablename表示されない。「このコレクションには項目がありません」のエラーが出る Windows10 Access2013 32Bitで確認 画面上でテーブルができているのに、テーブルの一覧を出力しても表示されない場合はこのエラーが起きている。

正しいテーブルの削除方法

Const TgTn = "TargetTableName"
Dim db As Database : Set db = CurrentDb
Dim tdfNew As TableDefs
For Each tdfnew In db.TableDefs
If ExistTable(TgTN) Then
DoCmd.DeleteObject acTable, TgTN
Application.RefreshDatabaseWindow: DoEvents
Set tdfnew = Nothing
Exit For
End If
Next

これでもエラーになるばあいがある。

テーブルに主キーの列を追加するVBA

注意点

  • 他に主キーが存在していないことが前提
  • この記事ではフィールド名をIDとしているが、かつて一度もIDという名前の主キー列を作ったことがないことが前提。
  • テーブルをコピーするなどしない限り、一度作った主キー列の名前は使うことができない。
    ACCESSで1列目にオートナンバー型フィールドを追加する方法
    'DoCmd.OpenTable MyTABLE, acDesign
    DoCmd.OpenTable MyTABLE, acViewDesign
    DoCmd.Save acTable, MyTABLE
    DoCmd.Close acTable, MyTABLE

  • 主キーをこのQAの後ろに次を1行が必要(テーブルに主キーがないことが前提)

  • Databaseobject.Execute "Create Index idx_tablename ON tablename (ID) WITH PRIMARY;"

  • QAのDoCmd.OpenTable MyTABLE, acDesign は誤り

Accessのテーブルにチェックボックス列(Yes/No)を追加

Yes/No True Falseのデータタイプならチェックボックスにかえられます。
変数は冒頭で宣言し、セットしておいてよい。
例えば Dim Db As database : Set db=CurrentDbと以下の行は並立する
Dim daoDB As DAO.Database: Set daoDB = CurrentDb 'この行からはCheckbox列を追加するための変数宣言
チェックボックスになるのはDisPlayContorolのプロパティになる
以下、データベースを作ってフィールドを追加し、つぎのようになっていきます。

Dim daoDB As DAO.Database: Set daoDB = CurrentDb 'この行からはCheckbox列を追加するための変数宣言
Set daotdf = daoDB.TableDefs!tablename 'daoでテーブルを指定する。
daofldName = "F18CheckBox" 'フィールド名
Set daoFld = daotdf.CreateField(daofldName, dbBoolean) 'Fldオブジェクトを作成して
daotdf.Fields.Append(daoFld) 'Fテーブルに追加
daoFld.Properties.Append(daoFld.CreateProperty("DisplayControl", dbInteger, acCheckBox, True))

Yes/No型のフィールドの表示コントロール[DisplayControl]の変更について - AccessClub

ファイルの共有ロック数

ファイルの共有ロック数が制限を超えています (Error 3052)レジストリエントリMaxLockPerFileの値を増やして下さい。(#-2147217887)
Transactionをしていなければ40000くらいは伸ばせるようだ
DAO.DBEngine.SetOption dbmaxlocksperfile,15000
元はDAO3.6を参照設定だがこの書き方は使えない。以下のように書くしかないようだ

Application.DBEngine.SetOption dbMaxLocksPerFile, 40000

アクセス2010 エラー3052

多数のトランザクション処理中にエラー メッセージ "ファイルの共有ロック数が制限を超えています" が表示される
2003が対象ですが、20102016でも有効です。