web-dev-qa-db-ja.com

vbaマクロのMS Accessにテーブルが存在するかどうかを確認する方法

可能性のある複製:
アクセステーブルが存在するかどうかを確認

Vbaマクロは初めてです。テーブルが存在するかどうかを確認する方法はありますか?以前の投稿を検索しましたが、これに対する明確な解決策が得られませんでした。

16
Karthik

Microsoft Access 12.0 Object Libraryへの参照を設定すると、DCountを使用してテーブルが存在するかどうかをテストできます。

Public Function ifTableExists(tblName As String) As Boolean

    If DCount("[Name]", "MSysObjects", "[Name] = '" & tblName & "'") = 1 Then

        ifTableExists = True

    End If

End Function
31
Karthik
Exists = IsObject(CurrentDb.TableDefs(tablename))
11

質問にはすでに回答済みですが、既存の回答が無効であることがわかりました。
バックエンドが機能していないリンクテーブルに対してTrueを返します。
DCountの使用ははるかに遅くなりますが、より信頼性が高くなります。

Function IsTable(sTblName As String) As Boolean
    'does table exists and work ?
    'note: finding the name in the TableDefs collection is not enough,
    '      since the backend might be invalid or missing

    On Error GoTo hell
    Dim x
    x = DCount("*", sTblName)
    IsTable = True
    Exit Function
hell:
    Debug.Print Now, sTblName, Err.Number, Err.Description
    IsTable = False

End Function
9
Patrick Honorez

これは新しい質問ではありません。 comments in one SO post に追加し、 my alternative implementation を別の投稿に追加しました。最初の投稿のコメントは実際に解明されています異なる実装間のパフォーマンスの違い。

基本的に、最も速く動作するのは、使用するデータベースオブジェクトによって異なります。

1
David-W-Fenton

Accessにはある種のシステムテーブルがあります ここで少し読むことができます 次のクエリを実行して、存在するかどうかを確認できます(1 =存在、0 =存在しません;))

SELECT Count([MSysObjects].[Name]) AS [Count]
FROM MSysObjects
WHERE (((MSysObjects.Name)="TblObject") AND ((MSysObjects.Type)=1));
0
Sjuul Janssen