Vba 从一批MS Access数据库读取表元数据

Vba 从一批MS Access数据库读取表元数据,vba,ms-access,Vba,Ms Access,我在一个目录中有70多个Access数据库。我认为其中一些是同一目录中其他数据库的分支。检测它们的一种方法是检查表的创建时间,但这种方法需要逐个打开文件和表并记录创建时间 有没有一种简单的方法来实现自动化?有没有办法读取一批Access文件表的创建时间?使用以下代码从目录中获取文件名和文件的创建日期。这将在excel工作表中显示结果,如列文件名和列B创建日期 Sub LoopThroughFiles() Dim strDir As String Dim StrFile As S

我在一个目录中有70多个Access数据库。我认为其中一些是同一目录中其他数据库的分支。检测它们的一种方法是检查表的创建时间,但这种方法需要逐个打开文件和表并记录创建时间


有没有一种简单的方法来实现自动化?有没有办法读取一批Access文件表的创建时间?

使用以下代码从目录中获取文件名和文件的创建日期。这将在excel工作表中显示结果,如列
文件名
和列B
创建日期

 Sub LoopThroughFiles()
    Dim strDir As String
    Dim StrFile As String
    Dim i As Long
    
    strDir = "D:\TEMP\"
    i = 1
    
    StrFile = Dir(strDir)
    Do While Len(StrFile) > 0
        Cells(i, 1) = StrFile
        Cells(i, 2) = myMetaData(strDir & StrFile)
        StrFile = Dir
        i = i + 1
    Loop

End Sub

Function myMetaData(CheckingFile As String)
    Dim fs As Object, f As Object
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set f = fs.GetFile(CheckingFile)
    myMetaData = f.DateCreated
End Function

您可以使用DAO在数据库中循环tableDef,并获取此信息。下面的内容应该可以帮助您开始:

Sub sCheckAll(strPath As String)
    On Error GoTo E_Handle
    Dim strFile As String
    strFile = Dir(strPath)
    Do
        If (Right(strFile, 3) = "mdb") Or (Right(strFile, 5) = "accdb") Then
            Call sTableDefCreateTime(strPath & strFile)
        End If
        strFile = Dir
    Loop Until strFile = ""
sExit:
    On Error Resume Next
    Exit Sub
E_Handle:
    MsgBox Err.Description & vbCrLf & vbCrLf & "sCheckAll", vbOKOnly + vbCritical, "Error: " & Err.Number
    Resume sExit
End Sub
Sub sTableDefCreateTime(strDBPath As String)
    On Error GoTo E_Handle
    Dim db As DAO.Database
    Dim tdf As DAO.TableDef
    Set db = DBEngine(0).OpenDatabase(strDBPath)
    For Each tdf In db.TableDefs
        If Left(tdf.name, 4) <> "MSys" Then '   exclude system tables
            Debug.Print tdf.name & vbTab & tdf.DateCreated & vbTab & tdf.Connect
        End If
    Next tdf
sExit:
    On Error Resume Next
    db.Close
    Set db = Nothing
    Exit Sub
E_Handle:
    MsgBox Err.Description & vbCrLf & vbCrLf & "sTableDefCreateTime", vbOKOnly + vbCritical, "Error: " & Err.Number
    Resume sExit
End Sub
子sCheckAll(strPath作为字符串)
错误转到E_句柄
作为字符串的Dim strFile
strFile=Dir(strPath)
做
如果(右(strFile,3)=“mdb”)或(右(strFile,5)=“accdb”),则
调用sTableDefCreateTime(strPath和strFile)
如果结束
strFile=Dir
循环直到strFile=“”
性别:
出错时继续下一步
出口接头
E_手柄:
MsgBox错误描述&vbCrLf&vbCrLf&“sCheckAll”,vbOKOnly+vbCritical,“错误:”&错误编号
恢复性生活
端接头
子sTableDefCreateTime(strDBPath作为字符串)
错误转到E_句柄
Dim数据库作为DAO.Database
将tdf调暗为DAO.TableDef
Set db=DBEngine(0).OpenDatabase(strDBPath)
对于以db.TableDefs为单位的每个tdf
如果左(tdf.name,4)“MSys”,则“排除系统表”
Debug.Print tdf.name&vbTab&tdf.DateCreated&vbTab&tdf.Connect
如果结束
下一个tdf
性别:
出错时继续下一步
db.关闭
Set db=Nothing
出口接头
E_手柄:
MsgBox错误描述&vbCrLf&vbCrLf&“sTableDefCreateTime”,vbOKOnly+vbCritical,“错误:”&错误编号
恢复性生活
端接头
它还获取连接字符串,因为某些表可能是链接的


尊敬,

我10天前在superuser.stackexchange上问了同样的问题。因为我没有得到答案,所以我在这里尝试。是的,有办法。那么你想把结果显示在哪里?任何地方。我只想自己用。在文本文件中,一个Access表或只是在屏幕上就可以了。请尝试我的答案。这只提供数据库本身的信息,而不是数据库中的表。感谢您的回答,但如果我理解得很好,代码会获取文件的创建日期,而我需要这些文件中表的创建日期。在MS Access中,您可以通过查看每个表的属性手动获取其创建数据。我只想查看同一目录中所有数据库中所有表的创建日期。