Семь лет спустя я не вижу, как это сделать в DAO, ни в одном из приведенных выше ответов или где-либо еще на любом сайте Stack Exchange. Вот метод, который я разработал. Следующий код VBA создает таблицу с полем автонумерации в качестве первичного ключа, помещает в нее произвольные данные, а затем открывает таблицу для отображения результатов. Я успешно запустил этот код в Access 2007.
Sub Make_Table_With_Autonum_Using_DAO()
Dim oDB As DAO.Database: Set oDB = CurrentDb()
Dim oTable As DAO.TableDef, sObjTable As String: sObjTable = "table_name"
Dim oField As DAO.Field, oIndex As DAO.Index
Dim oRS As DAO.Recordset
Set oTable = oDB.CreateTableDef(sObjTable)
With oTable
Set oField = .CreateField("ID_Object", dbLong) ' Create ID field.
oField.Attributes = dbAutoIncrField ' Make it autoincrement.
.Fields.Append oField ' Add to table's Fields collection.
Set oIndex = .CreateIndex("Index_Object") ' Create index.
oIndex.Primary = True ' Make it a primary key.
Set oField = oIndex.CreateField("ID_Object") ' Make index field for ID field.
oIndex.Fields.Append oField ' Add it to index's Fields coll'n.
.Indexes.Append oIndex ' Add index to table's Indexes coll'n.
Set oIndex = Nothing ' Remove index from memory.
Set oField = Nothing ' Remove field from memory.
.Fields.Append .CreateField("field2", dbText) ' Create and add other fields to
.Fields.Append .CreateField("field3", dbInteger) ' table's Fields collection.
' etc.
End With
oDB.TableDefs.Append oTable ' Add table to database's TableDefs collection.
Set oTable = Nothing
Set oRS = oDB.OpenRecordset(sObjTable) ' Enter arbitrary data into table.
oRS.AddNew: oRS!Field2 = "text 1": oRS!field3 = 123: oRS.Update
oRS.AddNew: oRS!Field2 = "text 2": oRS!field3 = 456: oRS.Update
oRS.AddNew: oRS!Field2 = "text 3": oRS!field3 = 789: oRS.Update
oRS.Close
DoCmd.OpenTable (sObjTable)
oDB.Close
Set oRS = Nothing
Set oDB = Nothing
End Sub
Документация Microsoft для необходимых элементов VBA в порядке появления в коде:
Эта документация говорит обо всем, что нужно знать, но не сводит все вместе, чтобы объяснить, как сделать первичный ключ автонумерации. Следующая документация MS (больше не доступная непосредственно от MS) объясняет, как сделать поле autonumber, но не как сделать его первичным ключом.
В следующем посте на форуме сообщества Microsoft принятый ответ Андрея Артемьева объясняет все это.
Мой код выше по сути такой же, как и его в этом ответе, с дополнительным комментарием, объясняющим, что происходит.