You can view TableDef objects to access index names.
Public Sub ShowIndexNames() Dim tdf As TableDef Dim idx As Index Dim num_indexes As Long On Error GoTo ErrorHandler For Each tdf In CurrentDb.TableDefs num_indexes = tdf.Indexes.Count If Left$(tdf.Name, 4) <> "MSys" Then If num_indexes > 0 Then For Each idx In tdf.Indexes Debug.Print tdf.Name, idx.Name Next idx End If End If Next tdf ExitHere: Exit Sub ErrorHandler: Select Case Err.Number Case 3110 'Could not read definitions; no read definitions ' 'permission for table or query '<Name>'. ' Debug.Print "No read definitions permission for " _ & tdf.Name num_indexes = 0 Resume Next Case Else Debug.Print Err.Number & "-> " & Err.Description GoTo ExitHere End Select End Sub
Change Revised sub file to ignore MSys * (Access system) tables.
You can also use the ADO OpenSchema method to get index information. The code below lists the index name, linked table, and whether the index is the primary key. I wrote it to use late binding for ADO because it does not require a link for the Microsoft ActiveX Data Objects [version] Library.
Const adSchemaIndexes As Long = 12 Dim cn As Object ' ADODB.Connection Dim rs As Object ' ADODB.Recordset Dim i As Long Set cn = CurrentProject.Connection Set rs = cn.OpenSchema(adSchemaIndexes) With rs ' enable next three lines to view all the recordset column names ' For i = 0 To (.Fields.Count - 1) ' Debug.Print .Fields(i).Name ' Next i Do While Not .EOF Debug.Print !TABLE_NAME, !INDEX_NAME, !PRIMARY_KEY .MoveNext Loop .Close End With Set rs = Nothing Set cn = Nothing
If you prefer to consider indexes for a single table rather than for each table in db, pass the table name as the fifth element of the array.
Set rs = cn.OpenSchema(adSchemaIndexes, Array(Empty, Empty, Empty, Empty, "tblFoo"))
source share