テーブルの削除
既存のテーブルを削除して新たなテーブルをコピーするとき
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
多数のトランザクション処理中にエラー メッセージ "ファイルの共有ロック数が制限を超えています" が表示される
2003が対象ですが、20102016でも有効です。