我同意user2174085,你的问题有很多。
我的方法是在类中对您的数据进行建模,并使用它们写入您的数据库。这将允许您根据需要验证数据,并将数据导入到所需数量的表中。
这种方法在 CRUD 应用程序中是标准的。
这是一个用于说明目的的简单示例,其中(我希望)清楚地描述了步骤):
1)定义我们的示例数据库:
表 1:客户端(ID、名称、地址 ID)
表 2:地址(ID、街道)
2) 定义我们的示例电子表格:
客户:ID、姓名、地址ID 1、Bob、1 2、Jim、2
地址:ID, Street 1, Gold Street 2, Derp Street
3) 定义我们的 2 个类,它们允许我们对单个客户端和单个地址进行建模。
要在 MS Access 中使用这些,请在代码编辑器窗口中添加一个类并粘贴以下类。有关更多信息,这是一个很好的 vba 类资源:http ://www.cpearson.com/excel/classes.aspx
客户端类:
Option Compare Database
Option Explicit
Dim intID As Integer
Dim strName As String
Dim intAddressID As Integer
'here we define a query (QueryDef) which is in the database (usp_Clients_InsertRecord), populate its parameters from the class variables and execute it to write the record
Public Sub Insert()
Dim qdfTemp As QueryDef
Set qdfTemp = CurrentDb().QueryDefs("usp_Clients_InsertRecord")
With qdfTemp
.Parameters("pName") = strName
.Parameters("pAddressID") = pAddressID
End With
qdfTemp.Execute
End Sub
地址类:
Option Compare Database
Option Explicit
Dim intID As Integer
Dim strStreet As String
'here we define a query (QueryDef) which is in the database (usp_Addresses_InsertRecord), populate its parameters from the class variables and execute it to write the record
Public Sub Insert()
Dim qdfTemp As QueryDef
Set qdfTemp = CurrentDb().QueryDefs("usp_Addresses_InsertRecord")
With qdfTemp
.Parameters("pStreet") = strStreet
End With
qdfTemp.Execute
End Sub
此时您可以执行验证,例如,您可以创建一个客户端记录,然后调用一个验证方法来告诉您数据是否正常。
未写入 ID 的原因是因为它是数据库中的自动编号。它仍然包含在类中,因为我们可能需要从数据库中的数据创建客户/地址记录,并使用其信息写入另一条记录。例如,要写入客户记录,我们可能需要检索地址记录,并带有用于写入客户记录的 AddressID。
4)以上类使用查询(存储过程)写入数据库,这里是一个示例查询:
usp_Clients_InsertRecord
参数 pName Text (255), pAddressID Long; 插入客户(姓名,地址ID)值(pName,pAddressID);
5)这一切都很好,但是我们如何从excel中获取数据,进入类,将其写入数据库?为此,我们使用管理类,这些类包含大量客户端或地址记录,从电子表格加载并存储在集合中。循环这个集合,调用 Insert 方法将记录写入数据库。
这为您的问题提供了一个答案,即如何将数据写入表 A,然后是 B,然后是 C。您将创建 3 个类,用数据填充它们,然后将 A 写入数据库,然后使用最后写入记录的 ID 写入 B到表 A(使用查询检索)等等。
下面是一个管理类的例子:
Option Explicit
'our clients collection
Private mcolClients As Collection
'adding objects to the clients collection
Public Function AddByParameter(byval Name as string, byval AddressID as integer)
dim objClient as Client
Set objClient = New Client
with objClient
.strName = Name
.intAddressID = AddressID
end with
mcolClients.Add objClient, Name
end function
'constructor
Private Sub Class_Initialize()
Set mcolClients = New Collection
End Sub
'you need this to be able to iterate over a collection
Public Function NewEnum() As IUnknown
Set NewEnum = mcolImportQuestions.[_NewEnum]
End Function
'you can then iterate over the collection, calling the insert method on each record:
public Sub InsertAllClients
dim objClient as Client
for each objClient in mcolClients
objClient.Insert
next objClient
end function
我想我已经走了一点,如果这有用,请告诉我/提出问题,我可以充实一下:)