Из Excel VBA - проверьте, существует ли таблица доступа / если нет, создайте / скопируйте - PullRequest
0 голосов
/ 14 января 2019

Я работаю с базой данных Access в VBA через Excel. Я хочу проверить, существует ли таблица в БД, а затем, если нет, я хочу создать таблицу, используя те же поля / определения, что и таблица с пометкой «Пустой» в этой базе данных. Я могу просто скопировать / переименовать Бланк, если это необходимо.

Я нашел способ проверить, существует ли таблица, используя следующее (хотя я не уверен, что это лучший способ).

Set objCatalog = CreateObject("ADOX.catalog")
objCatalog.ActiveConnection = dbConn
For i = 0 To objCatalog.Tables.Count - 1
    If objCatalog.Tables.Item(i).Name = tbName Then tbExists = True
Next

Это работает, но я изо всех сил пытаюсь найти способ скопировать или создать новую таблицу, используя поля / определения Бланка, когда таблица назначения не существует (tbExists = False).

Ответы [ 3 ]

0 голосов
/ 14 января 2019

Это сработало для меня:

Dim cn As ADODB.Connection
Set cn = New ADODB.Connection
cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\June\Umpires.accdb"
cn.Execute "SELECT Blank.* INTO [" & tbName & "] FROM Blank"
cn.Close
Set cn = Nothing

Новая таблица на самом деле не будет отображаться на панели навигации без каких-либо других действий, таких как сжатие и восстановление, закрытие / повторное открытие базы данных или запуск кода, который выбирает таблицу на панели навигации или как-то обновляя панель (скрытие / отображение панели делает что).

Некоторые настройки свойств поля не будут перенесены (AllowZeroLength = No). Поле вычисляемого типа вызовет ошибку во время выполнения, как и поле с несколькими значениями.

DoCmd.CopyObject и DoCmd.TransferDatabase могут точно копировать таблицу. DoCmd.Rename может просто переименовать таблицу. Всем потребуется код, который объявляет и открывает переменную объекта базы данных Access.

0 голосов
/ 14 января 2019

Создание объекта доступа из Excel vba

Sub TableExistOrCreate()

    Dim appAccess As Object, tbl As Object
    Set appAccess = CreateObject("Access.Application")

    appAccess.OpenCurrentDatabase ("C:\Users\santosh\Desktop\test.accdb")

    On Error Resume Next
    Set tbl = appAccess.currentdata.AllTables("Test")
    On Error GoTo 0

    If tbl Is Nothing Then
        appAccess.docmd.CopyObject , "Test", 0, "Blank"
    End If

    Set appAccess = Nothing

End Sub
0 голосов
/ 14 января 2019

Это может быть другой способ проверить, существует ли таблица, проверяя, возвращает ли определение таблицы что-либо.

Объект TableDef представляет сохраненное определение базовой таблицы или связанной таблицы (только для рабочих областей Microsoft Access).

Set exampleDB = workSpace.OpenDatabase(DatabaseName)

Set tableDefinition = exampleDB.TableDefs(TableName)
tableExists = Err.Number = 0

Для получения дополнительной информации

https://docs.microsoft.com/en-us/office/client-developer/access/desktop-database-reference/tabledef-object-dao

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...