使用Excel作为前端将特定的Access表数据导入Excel

时间:2014-05-20 15:39:32

标签: excel vba ms-access excel-vba ms-access-2007

我正在尝试存储和检索输入Excel的数据到Access中。我是一个Access新手,前端已经有一个Excel程序,导致我从Excel驱动导入。我已经成功地找到了如何将我的Excel命名范围保存到所需的Access表中,但现在我需要弄清楚如何将该Access表中的特定数据拉回到Excel中。我知道我可以简单地使用Excel中的Get External Data功能将整个Access表导入Excel,但我需要能够根据预定的参数集将表的特定部分导入Excel。这可能吗?

作为程序的背景,基本上它存储了零件号运行的数据。我不仅需要将新的零件运行保存到Access数据库(我想出来),而且我还需要能够将以前的零件号从Access拉回到Excel中以执行进一步的分析。这就是为什么我需要弄清楚如何只导入表的特定部分。我不确定我可以发布什么代码,因为我基本上是从头开始寻找代码;但如果您认为自己的Excel程序需要任何代码,我很乐意提供它。谢谢你的帮助。以下是代码:

Sub GetSpecData()
Application.ScreenUpdating = False
'*******************************************************************************
'Open the connection to the data source.
Set Connection = New ADODB.Connection
Connection.Open "Provider=Microsoft.Jet.OLEDB.4.0; " & "Data Source=\\Server2013\network_shared\QC SHARED\Databases\P&Q_Tracking_Data_Storage.mdb;"
'*******************************************************************************
'Create the new RecordSet.
Set Recordset = New ADODB.Recordset
With Recordset
'Define the appropriate Filter(s) and notify the user of the selection criteria.
    Src = "Select * from Raw_Data where Tag = 'GHI' "
    Src = Src & "or Tag = 'DEF' "
    Src = Src & "or Tag = 'LMN'"
    .Open Source:=Src, ActiveConnection:=Connection
    'Write the field names.
    For ODCol = 0 To .Fields.Count - 1
        Tracking.Sheets("Selected Past Data").Range("B7").Offset(0, ODCol).Value = .Fields(ODCol).Name
    Next
    'Write the recordset.
    Tracking.Sheets("Selected Past Data").Range("B7").Offset(1, 0).CopyFromRecordset Recordset
End With
Set Recordset = Nothing
Connection.Close
Set Connection = Nothing
'*******************************************************************************
'Create and format the table from the Recordset.
With Tracking.Sheets("Selected Past Data")
    DataLastRow = .Range("A" & Rows.Count).End(xlUp).row
    .ListObjects.Add(xlSrcRange, Range("B7:M" & DataLastRow), , xlYes).Name = "INC2tbl"
    .ListObjects("INC2tbl").ShowTotals = True
End With
Application.ScreenUpdating = True
'*******************************************************************************

End Sub

在谷歌搜索下面评论中的建议后,我有几个问题。首先,上面的代码似乎通过三个键过滤访问数据:GHI,DEF和LMN。我正确地解释了吗?第二,它说"从Raw_Data中选择*,其中Tag =' GHI' ",因为它在引号中,那不是将要执行的实际代码,对吗?这只是一个提示或类似的东西,对吗?

3 个答案:

答案 0 :(得分:0)

SELECT * FROM TABLE; OUTPUT TO TABLE Name.EXCEL FORMAT sql;

答案 1 :(得分:0)

  

首先,上面的代码似乎将访问数据过滤三次   密钥:GHI,DEF和LMN。我正确地解释了吗?   第二,   在那里它说“从Raw_Data中选择*,其中Tag ='GHI'”,因为   在引号中,这不是将要执行的实际代码,   正确?这只是一个提示或类似的东西,对吗?

第一和第二个问题密切相关,所以我会回答一个问题。这里的基本思想是存在与您定义的数据库的连接(在Connection.Open语句中)。连接本身什么也没做;建立联系。与数据库的实际通信是用特定的语言完成的,名为SQL(有很多方言,但为了简单起见,现在称它为SQL)。因此您的代码使用VBA语言,但与数据库的通信是在SQL中完成的。 VBA代码必须生成SQL语句(这些是字符串,因此您需要引号)。这就是Src变量的含义;和SQL语句。在这种情况下:

"Select * from Raw_Data where Tag = 'GHI' or Tag = 'DEF' or Tag = 'LMN'"

我认为这不是教你SQL的地方,但网上有很多关于它的信息。本声明的作用是:

选择表格“Raw_Data”中的所有列,但只选择Tag列中包含“GHI”,“DEF”或“LMN”的数据行。

因此,要从表“part_numbers”接收所有数据,您必须使用:

"SELECT * FROM part_numbers;"

如果您只需要导入列“col_1”和“col_2”,则可以使用:

"SELECT col_1,col_2 FROM part_numbers;"

如果您只需要导入列“col_1”和“col_2”,并且只导入“part_id”低于1000的行,您可以使用:

"SELECT col_1,col_2 FROM part_numbers WHERE part_id < 1000;"

真的是这样的。现在,如果您的记录集(将其视为包含您要求的数据的数组)已查询数据库,则可以循环它以解析数据。类似的东西:

Set Recordset = Connection.Execute(Src)
Do until Recordset.EOF
    debug.print Recordset!col_1
    Recordset.movenext
loop

再次,google之类的话:“vba excel adodb access”,你会看到很多例子。

答案 2 :(得分:0)

在研究SQL代码格式化之后,我对这个主题有了更多的了解。谢谢你的帮助。