将记录从一个表追加到另一个表(具有不同的列)

时间:2013-03-15 16:47:10

标签: excel vba ms-access

我正在寻找一种方法将记录从一个表有效地添加到另一个表。表格类似,但不同。假设我正在尝试将Employee表B中的所有数据附加到Employee表A中。

   Employee Table B
   ---------------
   EmpID (int), fname (text), lname(text)
   1            Bob           Dole

我希望将此数据附加到

   Employee Table A
   empid (int)  fname(text)    lname(text)     DateOfBirth (DateTime)

作为

   1             Bob           Dole              null / blank

我必须为大约30多个表做这个,我正在寻找一个快速的方法来做到这一点。

我想使用Access的某些导入功能来节省时间,而不是编写INSERT INTO table_a(empid, fname, lname) SELECT empid, fname,lname FROM table_b。我尝试将每个表转储到excel并附加到必要的表,但我得到了Subscript out of range error。我也试过复制粘贴记录无济于事。

是否有Access提供的工具可以省去为每个表编写追加查询的麻烦?

1 个答案:

答案 0 :(得分:1)

如果两个表中的字段名称相同(缺少的字段除外),您可以编写一些代码来为您完成。使用TableDefshttp://msdn.microsoft.com/en-us/library/office/bb220949(v=office.12).aspx)对象循环遍历表并查找要附加的“_a”表,并通过查询TableDef的.Fields集合即时创建INSERT语句。

例如,这样的事情应该有用(未经测试,手工编写!):

Dim dbs As DAO.Database
Dim tdfLoop As TableDef
Dim strSql As String
Dim i as Integer
Dim strSourceTable as String
Dim strFieldList as String

Set dbs = CurrentDb

With dbs
  For Each tdfLoop In .TableDefs
     If Right(tdfLoop.Name, 2) = "_a" Then            
         strSourceTable = Mid(tdfLoop.Name, 1, Len(tdfLoop.Name)-2) & "_b"
         strSql = "INSERT INTO " & tdfLoop.Name & "("
         strFieldList = ""
         For i = 0 To tdfLoop.Fields.Count - 1
             strFieldList = strFieldList & tdfLoop.Fields(i).Name & ","
         Next i
         If strFieldList <> "" Then
             strFieldList = Mid(strFieldList, 1, Len(strFieldList) - 2)
         End If

         strSql = strSql & strFieldList & ") SELECT " & strFieldList & " FROM " & strSourceTable

         dbs.Execute(strSql)
     End If
  Next tdfLoop
End With

dbs.Close
Set dbs = Nothing

如果“缺少字段”没有在表格中定义默认值,那么您可以修改上述内容以在其列中返回NULL值,但我认为它们已经存在。