使用Excel VBA从Access数据库获取数据

问题描述 投票:0回答:3

我无法从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
excel vba ms-access
3个回答
1
投票

张贴的代码缺少End If线。也许这只是一个帖子错字,因为代码不应该编译和运行。

查询SQL需要#delimiters作为日期参数:

Source = "SELECT * FROM Tracking WHERE [Date_Logged] BETWEEN #" & startdt & "# AND #" & stopdt & "# ORDER BY [Date_Logged]"

文本字段需要撇号分隔符。数字字段不需要分隔符。


0
投票

我在几个小时后解决了我自己的问题的答案,我找到了一组不同的代码。感谢大家的帮助!

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

0
投票

在Excel中获取数据的简单方法是使用“数据>访问”菜单,尤其是从Access中获取数据。这将创建与表的连接,您可以自由编辑。 至少,这是一种将调查限制在以下方面的便捷方式:

  • 您键入的查询(连接字符串将始终正常,因此如果您没有获取任何值,则它来自查询)
  • 或者VBA本身(如果表返回值而不是相应的VBA Sub,那么你知道它来自VBA本身,而不是SQL)。

我正在跳过连接的创造,因为它真的很简单;最好将注意力集中在创建表格后可以做的事情上。

编辑连接

当您选择表并转到菜单“数据>属性”,然后在窗口中单击右上角的“连接属性”按钮,即可获得连接的定义,即第一个选项卡中的一些属性和实际第二个选项卡中的定义。

如果移动.mdb文件,则必须相应地更改连接字符串。不应该有其他事件迫使你改变它。

如果要键入实际的复杂查询,则需要:

  1. 将命令类型从“表”更改为“SQL”
  2. 在底部编辑框中键入查询。 注意,如果要在WHERE子句中定义动态参数,可以放置问号(?)而不是硬编码值。问号可以链接到常量(提示更改其值)或单元格。

在VBA中使用

一旦您检查了一切正常的连接,您就有2个解决方案可以将其放入VBA中。

要么完全使用上面的代码;在这种情况下,只需复制连接字符串和查询即可轻松完成任务。

或者,这是我建议的,我们之前构建的表可以在VBA中非常容易地更新。

使用这段代码:

WorksheetWithTable.ListObjects(1).QueryTable.Refresh 

你真的不需要超过这一行代码来进行刷新。 如果将查询设置为在修改单元格的值时自动刷新,则根本不需要它。

注意#1:您可以使用表名来代替.ListObjects(1)中的索引。 节点#2:如果要在后台刷新查询,则Refresh具有可选参数。 True表示在转移到下一条指令之前,VBA代码不会等待执行结束。显然,False正好相反。

© www.soinside.com 2019 - 2024. All rights reserved.