2013-10-21 37 views
1

我有60个具有相同数据库结构的MS Access文件。我想从两个与每个数据库相关的表中获取数据,以便从这60个文件中创建一个包含所有记录的单个数据库。有没有简单的方法来合并所有这些MS Access文件?女士访问合并多个访问文件表

回答

3

如果我正确地理解了你,你将在60个数据库文件中分布相同的表格,并且您正在寻找一种自动进行聚合的方法。

有几种不同的方法可以做到这一点。这可能取决于你的情况。我已经演示了两种不同的方法。

第一种方法很简单。它只是构建一个静态查询,将数据库名称替换为每个查询。如果你的具体情况过于简单 - 那么这应该是个诀窍。

第二种方法使用DAO打开每个数据库中的每个表并将数据写入当前数据库。如果您有一次性异常并需要添加一些智能,则此方法非常有用。

Public Sub SimpleCombine() 

    Dim DBFileList As Collection 
    Dim DBPath As String 
    Dim ForeignTableName As String 
    Dim LocalTableName As String 
    Dim dbfile As Variant 

    ' Configure 
    Set DBFileList = New Collection 
    DBFileList.Add "Test1.accdb" 
    DBFileList.Add "Test2.accdb" 
    DBPath = CurrentProject.Path ' (No Trailing Backslash) 
    ForeignTableName = "Fruit" 
    LocalTableName = "Fruit" 

    For Each dbfile In DBFileList 
     querystr = "INSERT INTO Fruit (FruitName, FruitValue) " & _ 
       "SELECT FruitName, FruitValue " & _ 
       "FROM Fruit IN '" & DBPath & "\" & dbfile & "'" 
     Debug.Print "Transferring Data From " & dbfile 
     CurrentDb.Execute querystr 
     DoEvents 
    Next 
End Sub 

例2

Public Sub DAOCombine() 

    Dim DBFileList As Collection 
    Dim DBPath As String 
    Dim ForeignTableName As String 
    Dim LocalTableName As String 
    Dim db As DAO.Database 
    Dim rst, drst As DAO.Recordset 
    Dim fld As DAO.Field 

    ' Configure 
    Set DBFileList = New Collection 
    DBFileList.Add "Test1.accdb" 
    DBFileList.Add "Test2.accdb" 
    DBPath = CurrentProject.Path ' (No Trailing Backslash) 
    ForeignTableName = "Fruit" 
    LocalTableName = "Fruit" 

    Set drst = CurrentDb.OpenRecordset(LocalTableName) 
    For Each dbfile In DBFileList 
    Debug.Print "Transferring Data From " & dbfile 
    Set db = DBEngine.Workspaces(0).OpenDatabase(DBPath & "\" & dbfile) 
    Set rst = db.OpenRecordset(ForeignTableName) 

    Do Until rst.EOF 
     drst.AddNew 
     For Each fld In rst.Fields 
     If (fld.Attributes And dbAutoIncrField) = dbAutoIncrField Then 
      ' We have an autonumber field - lets skip 
     Else 
      drst.Fields(fld.Name).Value = fld.Value 
     End If 
     Next 
     drst.Update 
     rst.MoveNext 
    Loop 
    rst.Close 
    DoEvents 
    Next 
    drst.Close 

    Set rst = Nothing 
    Set drst = Nothing 
End Sub 

你需要的代码以适应您的具体情况 - 但它应该做的伎俩。

+0

感谢您的回复 – sanjay