我无法从Access数据库中获取数据。我在网上找到了这个代码,它似乎工作(在某种程度上),但由于某种原因它只会拉出列标题,而不会从查询中提取任何数据。我对Access不太熟悉,这就是为什么我从离线中取出一个。
有人一段时间有类似的帖子,他们使用的代码是相同的,我们的查询完全相同,但我们有不同的问题。 Importing Data From Access Using Excel VBA
有人会碰巧知道为什么数据不会拉?
Sub getDataFromAccess()
Dim DBFullName As String
Dim Connect As String, Source As String
Dim Connection As ADODB.Connection
Dim Recordset As ADODB.Recordset
Dim Col As Integer
Dim startdt As String
Dim stopdt As String
Dim refresh
refresh = MsgBox("Start New Query?", vbYesNo)
If refresh = vbYes Then
Sheet1.Cells.Clear
startdt = Application.InputBox("Please Input Start Date for Query (MM/DD/YYYY): ", "Start Date")
stopdt = Application.InputBox("Please Input Stop Date for Query (MM/DD/YYYY): ", "Stop Date")
DBFullName = "X:\MyDocuments\CMS\CMS Database.mdb"
' Open the connection
Set Connection = New ADODB.Connection
Connect = "Provider=Microsoft.ACE.OLEDB.12.0;"
Connect = Connect & "Data Source=" & DBFullName & ";"
Connection.Open ConnectionString:=Connect
Set Recordset = New ADODB.Recordset
With Recordset
Source = "SELECT * FROM Tracking WHERE [Date_Logged] BETWEEN " & startdt & " AND " & stopdt & " ORDER BY [Date_Logged]"
.Open Source:=Source, ActiveConnection:=Connection
For Col = 0 To Recordset.Fields.Count - 1
Range(“A1”).Offset(0, Col).Value = Recordset.Fields(Col).Name
Next
Range(“A1”).Offset(1, 0).CopyFromRecordset Recordset
End With
ActiveSheet.Columns.AutoFit
Set Recordset = Nothing
Connection.Close
Set Connection = Nothing
End Sub
张贴的代码缺少End If
线。也许这只是一个帖子错字,因为代码不应该编译和运行。
查询SQL需要#delimiters作为日期参数:
Source = "SELECT * FROM Tracking WHERE [Date_Logged] BETWEEN #" & startdt & "# AND #" & stopdt & "# ORDER BY [Date_Logged]"
文本字段需要撇号分隔符。数字字段不需要分隔符。
我在几个小时后解决了我自己的问题的答案,我找到了一组不同的代码。感谢大家的帮助!
Sub getdatamdb()
Dim cn As Object, rs As Object
Dim intColIndex As Integer
Dim DBFullName As String
Dim TargetRange As Range
10 DBFullName = "X:\MyDocuments\CMS\CMS Database.mdb"
20 On Error GoTo Whoa
30 Application.ScreenUpdating = False
40 Set TargetRange = Sheets("Sheet1").Range("A1")
50 Set cn = CreateObject("ADODB.Connection")
60 cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & DBFullName & ";"
70 Set rs = CreateObject("ADODB.Recordset")
80 rs.Open "SELECT * FROM Tracking WHERE [Date_Logged] BETWEEN #" & startdt & "# AND #" & stopdt & "# ORDER BY [Date_Logged]", cn, , , adCmdText
' Write the field names
90 For intColIndex = 0 To rs.Fields.Count - 1
100 TargetRange.Offset(1, intColIndex).Value = rs.Fields(intColIndex).Name
110 Next
' Write recordset
120 TargetRange.Offset(1, 0).CopyFromRecordset rs
LetsContinue:
130 Application.ScreenUpdating = True
140 On Error Resume Next
150 rs.Close
160 Set rs = Nothing
170 cn.Close
180 Set cn = Nothing
190 On Error GoTo 0
200 Exit Sub
Whoa:
210 MsgBox "Error Description :" & Err.Description & vbCrLf & _
"Error at line :" & Erl & vbCrLf & _
"Error Number :" & Err.Number
220 Resume LetsContinue
End If
End Sub
在Excel中获取数据的简单方法是使用“数据>访问”菜单,尤其是从Access中获取数据。这将创建与表的连接,您可以自由编辑。 至少,这是一种将调查限制在以下方面的便捷方式:
Sub
,那么你知道它来自VBA本身,而不是SQL)。我正在跳过连接的创造,因为它真的很简单;最好将注意力集中在创建表格后可以做的事情上。
编辑连接
当您选择表并转到菜单“数据>属性”,然后在窗口中单击右上角的“连接属性”按钮,即可获得连接的定义,即第一个选项卡中的一些属性和实际第二个选项卡中的定义。
如果移动.mdb文件,则必须相应地更改连接字符串。不应该有其他事件迫使你改变它。
如果要键入实际的复杂查询,则需要:
WHERE
子句中定义动态参数,可以放置问号(?)而不是硬编码值。问号可以链接到常量(提示更改其值)或单元格。在VBA中使用
一旦您检查了一切正常的连接,您就有2个解决方案可以将其放入VBA中。
要么完全使用上面的代码;在这种情况下,只需复制连接字符串和查询即可轻松完成任务。
或者,这是我建议的,我们之前构建的表可以在VBA中非常容易地更新。
使用这段代码:
WorksheetWithTable.ListObjects(1).QueryTable.Refresh
你真的不需要超过这一行代码来进行刷新。 如果将查询设置为在修改单元格的值时自动刷新,则根本不需要它。
注意#1:您可以使用表名来代替.ListObjects(1)
中的索引。
节点#2:如果要在后台刷新查询,则Refresh具有可选参数。 True
表示在转移到下一条指令之前,VBA代码不会等待执行结束。显然,False
正好相反。