0

我有一个 Access 2010 数据库,它将从 Excel 工作表中导入数据并将该数据附加到正确的表中。我遇到的问题是,一旦导入,数据将不会附加客户 ID,因此表中的 cust_ID 字段将为空。我需要的是一个宏,它将询问用户每次导入的客户是谁,然后找到该客户的 ID 并将该值放入所有空字段中。我在这方面做了很多不同的尝试(主要是虽然宏构建器我什至不知道从哪里开始使用 VBA),但都没有显示任何结果。我认为我的最新版本很接近,但由于某种原因,它在导入后没有运行。我有一个“插入后”宏,这个想法是它会提示用户 [Customer Name] 从 TBL_Customers 中查找 custID,然后将其插入到每个空字段中。不幸的是,在我导入我的数据后,什么都没有发生,我真的不知道为什么。

Parameters Name: Customer Name

Look Up A Record In TBL_Customers
Where Condition =[TBL_Customers].[FLD_Customer_Name]=[Customer Name]
Alias custName

Look Up A Record In TBL_Customers
    Where Condition =[TBL_Customers].[FLD_Customer_PK_ID]=[custName]
    Alias custID

For Each Record In TBL_Contacts
Where condition =IsNull([FLD_Contact_FK_Customer_ID])

EditRecord
    SetField
        Name FLD_Contact_FK_Customer_ID
        Value =[custID]
End EditRecord 

我在想的另一种可能性是在 Excel 工作表中添加另一列,其中包含客户姓名,然后 Access 只需根据该列查找 cust_ID。我的问题是我不知道如何告诉 Access 从 Excel 工作表中导入客户名称,找到该客户的 ID 并将该 ID 插入到正确的表中,这就是我倾向于第一个选项的原因。

正如我在评论中所说,我尝试了很多不同的东西,但我对 VBA/Access 还很陌生,而且我已经没有想法可以尝试了。不确定哪个更容易/更好,因此非常感谢任何想法/建议/建议。

4

2 回答 2

0

我不能说如何使用 Access 宏来做到这一点,但在 VBA 中做到这一点并不难。

我会在 excel 中编写宏 - 导入 activex 数据对象 2.8 库参考。

首先声明连接对象 - 这适用于我们设置的 MySQL 服务器,如果您只是通过本地网络连接,则可以使用 JET 驱动程序。

Dim cnn As ADODB.Connection
Dim rst As ADODB.Recordset
Set cnn = New ADODB.Connection
cnn.CursorLocation = adUseServer
cnn.Open "Driver={MySQL ODBC 5.2a Driver};Server=myserver;database=my_db;uid=user;pwd=P@ssword"
Set rst = New ADODB.Recordset
rst.CursorLocation = adUseServer

当您拥有客户名称(从用户那里获取名称,可能是通过输入框)时,ping 数据库以检索 id 并保存它。

rst.open "Select id from customers where customername = '"  & userSubmittedName & "'", 
cnn,adopenforwardonly,adlockbatchoptimistic

dim customerID as integer
customerID = rst.fields("id").Value

然后只需输入数据即可。Access 具有 DoCmd.RunSQL 命令,但在 Excel 中您将使用 ADO 记录集。它是这样工作的 -

rst.open "Select * from Orders",cnn,adopenforwardonly,adlockbatchoptimistic
Fo r x = 2 to rowCount 'Once you have the number of rows you're inputting saved obviously
 rst.addnew
 rst.fields("ID") = customerID
 rst.fields("OrderAmount") = range("A" & x).value
 rst.fields("SaleAmount") = range("B" & x).value
 ....
 rst.update
next x
于 2013-09-03T21:04:47.803 回答
0

以下是一些可能让您朝着正确方向前进的示例。在我的情况下,我有类似的情况,从 excel 导入,但经常丢失一条数据。我所做的是让“用户”将 excel 文档保存到子文件夹中,并将客户 ID 作为文件夹名称的一部分。使用 Scripting 库,您可以递归遍历子文件夹,我使用自定义 FindCustomerID 函数从路径名中解析您要查找的 ID。导入完成后,可以添加客户 ID。

Function ImportBlah(importDir As String, tbl As String)

Dim importPath As String
Dim fs As Scripting.FileSystemObject
Dim fo, x AS Folder
Dim fi AS File
Dim custID As String

Set fs = CreateObject("Scripting.FileSystemObject") 

With fs
    Set fo = .GetFolder(importDir)
    For Each x In fo.SubFolders
        For Each fi In x.Files
            If Not (fi.Attributes Mod 8 >= 4) Then 'If not a system file
                DoCmd.TransferText acImportDelim, "import_specs", tbl, fi, True
                custID = FindCustomerID(x.Path)
                CurrentDb.Execute "UPDATE " & tbl & " SET FileName = '" _ 
                   & fi.ParentFolder.name & "\" & fi.name & "' WHERE FileName IS NULL", _ 
                   dbFailOnError 'Add filename to Filename column
                CurrentDb.Execute "UPDATE " & tbl & " SET custID = '" & _ 
                   custID & "' WHERE custID IS NULL", dbFailOnError 'Add custID to custID column
                .MoveFile fi, x & "\Imported\"
            End If
        Next
    Next
End With    
End Function

此代码需要启用对 Microsoft 脚本运行时的引用。

于 2013-09-03T19:53:47.303 回答