我正在尝试存储和检索输入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' ",因为它在引号中,那不是将要执行的实际代码,对吗?这只是一个提示或类似的东西,对吗?
答案 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代码格式化之后,我对这个主题有了更多的了解。谢谢你的帮助。