从电子表格和Access数据库获取用户标识

为什么这个代码不工作? 对不起,一般的问题….

我负责生成需要从访问数据库和Excel电子表格中提取的参考信息的报告。

基本上,我负责为住在社区的人们提供服务; 我提供服务的所有人的logging都包含在访问数据库中。 有参考资料 定期向出资人或董事会报告的地址,名称,情况和其他信息。

我也为当地企业提供服务; 此信息包含在电子表格中,而不是数据库。 这些信息可以放在一个关系数据库中,两者联系在一起; 但是组织对系统的重大改变有抵触,实际上也不知道如何做到这一点。

所以我正在努力推进一个电子表格 – 如果我向A人员或B组织提供服务,那么这个电子表格将同时检查访问数据库和Excel电子表格,以查看是否input了该人员或组织; 如果是,则应该用该信息填充表格,并为其分配唯一的代码。

唯一的代码是根据数据库确定的; 不pipe该人员或组织是否已经进入数据库。

我在基地工作的电子表格是这样的:

在这里输入图像说明

底部表我正在寻找一个“查找”表。 它的名字是Lookup。 我想运行它的代码看起来像这样(但obv不是这样):

Sub getUserID() Dim myTable As ListObject Set myTable = Sheets("Client Codes").ListObjects("Lookup") If myTable.ListRows.Count >= 1 Then myTable.DataBodyRange.Delete End If With Sheets("Client Codes").ListObjects("Lookup").Add(SourceType:=0, Source:=Array(Array("ODBC;DSN=MS Access Database;DBQ=C:\database\here\test.accdb;DefaultDir=F:\Housing;DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeo"), Array("ut=5;")), Destination:=myTable.Range(Cells(1, 1))) .CommandText = Array("SELECT Clients.ID, Clients.LastName, Clients.FirstName " & Chr(13) & "" & Chr(10) & "FROM `C:\database\here\test.accdb`.Clients Clients" & Chr(13) & "" & Chr(10) & "WHERE (Clients.LastName='" & Range("b1").End(xlDown) & "') AND (Clients.FirstName='" & Range("c1").End(xlDown) & "')") End With With Sheets("Client Codes").ListObjects("Lookup").Add(SourceType:=0, Source:=Array(Array("ODBC;DSN=Excel Files;DBQ=C:\spreadsheet\here\text.xlsx;DefaultDir=c:\spreadsheet;DriverId=1046;MaxBufferSize=2"), Array("048;PageTimeout=5;")), Destination:=myTable.Range(Cells(1, 1))) .CommandText = Array("SELECT `Businesses$`.Operation" & Chr(13) & "" & Chr(10) & "FROM `C:\spreadsheet\here\test.xlsx`.`Businesses$` `Businesses$`" & Chr(13) & "" & Chr(10) & "WHERE (`Businesses$`.Operation='" & Range("b1").End(xlDown) & "')") End With End Sub 

希望能够根据个人名字和姓氏来查询数据库,或者根据组织名称来查询电子表格; 如果find了一个值,可以在表中添加一些信息。 如果没有发现,我会知道它是一个新的条目,并input这样的信息。

作为参考,数据库有3个字段(ID,LastName,FirstName); 和电子表格有1列(操作)。

真的困惑在这里集中:

  1. 如何将基于查询的信息“添加”到列表对象到预先存在的表中
  2. 如何使用访问数据库和Excel电子表格来执行此操作

任何build议在其他方面如何做到这一点,将不胜感激; 从多个数据源中提取信息到一个表中,以便在该表中进行validation。

编辑:如果我通过访问或其他数据库程序,我会做两个表上的INNERJOIN; 一个人,另一个企业。 我期待保持优秀,但我发现它更加用户友好。

编辑:基于伊恩的回应代码….生成以下错误信息:'运行时错误-2147467259,找不到可安装的ISAM'

在互联网上的研究似乎表明如下:1)人们得到这个错误之前2)可能没有一个正确的DLL安装 – 不确定是这样的,因为我试图从Excel访问访问,它doesn看起来有一个DLL访问这里: https : //support.microsoft.com/en-us/kb/209805 3)有可能是如何连接string框架的问题。 数据源可能需要用引号括起来,JET OLEDB需要使用而不是ACE,连接string需要扩展以包含'扩展属性': 错误:“找不到可安装的ISAM”

最后一个显然是最大的目标(并有最大的错误)。

 Option Explicit Sub getUserID() Dim cmd As New ADODB.Command Dim conn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim strConn As String Dim strSQL As String Dim firstName As String Dim lastName As String firstName = "John" lastName = "Smith" strConn = "Provider = Microsoft.ACE.OLEDB.12.0;'DataSource=F:\Housing\bpTest.accdb'" conn.Open strConn strSQL = "SELECT * FROM Table Where FirstName = '" & firstName & "' AND LastName = '" & lastName & "';" '& ... ' or You could put your InnerJoin SQL here rs.Open strSQL, conn, adOpenDynamic, adLockOptimistic If rs.EOF Then 'If the returned RecordSet is empty MsgBox ("No record found") Else MsgBox (rs.Index) End If end sub 

你会最喜欢使用ActiveX数据对象来完成这一点。 这将允许您从访问数据库中提取数据,并从Excel中更新访问数据库中的logging。

这里是微软的参考资料: https : //msdn.microsoft.com/en-us/library/ms677497(v=vs.85).aspx

还有一些示例代码:

 Dim cmd As New adodb.Command Dim conn As New adodb.Connection Dim rs As New adodb.Recordset Dim strConn As String strConn = "Provider = Microsoft.ACE.OLEDB.12.0;" _ & "Data Source=C:\AccessDatabse.accdb" conn.Open strConn strSQL = "SELECT * FROM Table Where FristName =" & strName & ... ' or You could put your InnerJoin SQL here rs.Open strSQL, conn, adOpenDynamic, adLockOptimistic If rs.EOF then 'If the returned RecordSet is empty '...there is no match in database Else 'the rs object will hold the ID you are looking for End If 

您可以添加一个新的logging到Access数据库:

 myFieldList = Array("ID", "FirstName", "LastName") myValues = Array(IDValue, FirstNameValue, LastNameValue) rs.AddNew myFieldList, myValues