LoginSignup
0
0

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-07-15

テーブルの削除

既存のテーブルを削除して新たなテーブルをコピーするとき
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でも有効です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0