为什么这段代码不起作用?对于通用问题抱歉....
我的任务是生成报告,其中包含需要从访问数据库和Excel电子表格中提取的参考信息。
基本上,在我的职位上,我负责为社区居民提供服务;我提供服务的所有人的记录都包含在访问数据库中。有参考信息;向资助者或董事会定期报告所需的地址,名称,情况和其他信息。
我也为当地企业提供服务;此信息包含在电子表格中,而不是数据库中。信息可以放入关系数据库,两者相关;但是组织对系统的重大改变存在阻力,也不知道如何做到这一点。
所以我试图继续使用电子表格 - 如果我向A人或组织B提供服务,该电子表格将检查访问数据库和Excel电子表格,以查看该人员或组织是否是进入;如果是,它应该使用该信息填充表,并为其分配唯一的代码。
唯一代码是根据数据库确定的;以前该人或组织是否已进入数据库。
我在基地工作的电子表格是:
我希望找到一个'查找'表。它的名字是Lookup。我想用它运行的代码看起来像这样(但事实并非如此):
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
希望能够根据人名和姓名查询数据库,或者根据组织名称查询电子表格;如果找到了值,则在表格中添加一些信息' Lookup'。如果找不到任何内容,那么我将知道它的新条目,并输入相关信息。
作为参考,数据库有3个字段(ID,LastName,FirstName);电子表格有1列(操作)。
真的很混乱:
对于如何做到这一点的其他方式的任何建议将不胜感激;将来自多个数据源的信息提取到一个表中,以便可以在该表中进行验证。
编辑:如果我通过Access或其他数据库程序执行此操作,我会在两个表上执行INNERJOIN;一个人,另一个人。我希望保持优秀 - 我发现它更加用户友好。编辑:基于Ian的响应代码....生成以下错误消息: '运行时错误-2147467259,找不到可安装的ISAM'
互联网研究似乎表明如下: 1)之前人们已经犯了这个错误 2)可能没有安装正确的DLL - 不确定是这种情况,因为我试图从excel访问访问权限,并且它似乎没有用于访问的DLL:{{ 3}} 3)可能存在连接字符串如何构成的问题。数据源可能需要在引号中,JET OLEDB需要使用而不是ACE,连接字符串需要扩展为包含扩展属性'在这里:https://support.microsoft.com/en-us/kb/209805
最后一个显然是最大的目标(并且关于它的错误最多)。
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
答案 0 :(得分:0)
您最希望使用ActiveX数据对象来实现此目的。这将允许您从访问数据库中提取数据,还可以从Excel更新访问数据库中的记录。
以下是Microsoft参考资料: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
您可以使用以下命令将新记录添加到Access数据库:
myFieldList = Array("ID", "FirstName", "LastName")
myValues = Array(IDValue, FirstNameValue, LastNameValue)
rs.AddNew myFieldList, myValues