1

同じデータベース構造を持つ 60 個の MS Access ファイルがあります。各データベースから関連している 2 つのテーブルからデータを取得して、これらの 60 ファイルのすべてのレコードを含む 1 つのデータベースを作成したいと考えています。これらすべての MS Access ファイルをマージする簡単な方法はありますか?

4

1 に答える 1

3

私の理解が正しければ、60 個のデータベース ファイルにまたがる同一のテーブルがあり、それらの集計を自動化する方法を検討していると思います。

これを行うには、いくつかの方法があります。それはおそらくあなたの状況に依存します。2 つの異なるアプローチを示しました。

最初の方法は簡単です。各クエリにデータベース名を代入して、静的クエリを作成するだけです。詳細が単純化されている場合は、これでうまくいくはずです。

2 番目の方法では、DAO を使用して各データベースの各テーブルを開き、データを現在のデータベースに書き込みます。この方法は、1 回限りの例外があり、インテリジェンスを追加する必要がある場合に役立ちます。

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

特定の状況に合わせてコードを調整する必要がありますが、うまくいくはずです。

于 2013-10-21T14:40:46.910 に答える