2017-02-23 148 views
0

我想知道是否有人可以推荐一种替代方法来从MS Access模块​​中查询excel文件中的数据。VBA替代workbook.open从单个单元格中提取数据

如果我在一个典型的“表”的格式例如行和列报头组织了数据,那么我已使用DAO连接如下

Dim db as DAO.Database 
Dim rsUsers as DAO.Recordset 

Set db = OpenDatabase("C:\SaleLog.xls", False, True, "Excel 8.0;HDR=Yes;") 
Set rsUsers = db.OpenRecordset("SELECT userID FROM [Sales$]") 

连接到所述工作簿我发现这个优选使用

Dim xlApp As Excel.Application 
Set xlApp = CreateObject("Excel.Application") 

xlApp.Workbooks.Open "C:\SaleLog.xls", True, False 

由于它没有物理打开excel会话的实例,因此运行速度更快。

唯一的问题是数据没有像表格一样布置(例如,如果我只想得到1个特定单元格的值)。
有没有人知道是否有方法检查VBA中单元格的值而不使用Workbook.Open

+0

有关链接到电子表格作为链接表是什么? – Minty

+0

https://www.mrexcel.com/forum/excel-questions/645172-visual-basic-applications-code-pulling-data-closed-workbook-wo-opening.html –

+0

嗨@Minty,不幸的是,如上所述,数据没有像表格一样布置,所以我不能以这种方式链接到数据。 – Leroy

回答

0

可能有一种更简单的方法来实现这一点,但我发现了3种方法可以用来将数据从单个单元格中的单个单元格中相对有效地关闭的Excel工作簿中拉出来(非常感谢John Muggins在他的帮助下这个)。

首先,workbooks.open方法可以使用,并且如果您将只读参数设置为true,则运行速度会更快(我不确定这是否在技术上'打开'工作簿,但它绝对看起来在读取时运行得更快-只要)。这要求您设置对Excel库的引用。

Dim xlApp As Excel.Application 
Dim src As Workbook 

Set xlApp = CreateObject("Excel.Application") 
Set src = xlApp.Workbooks.Open "C:\SaleLog.xls", True, True 

然后你可以从使用普通的Excel VBA语法像这样

strUser = src.Worksheets("Sales").Range("B8") 

src.Close False 'false doesn't save changes 
Set src = Nothing 

另一种方法是使用DoCmd.Transferspreadsheet方法链接或导入一个单细胞,在这种情况下,你的特定细胞数据需要将HasFieldNames参数设置为false,如图所示

path = "C:\SaleLog.xls" 
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "tblTemp", path, False, "Sales!B8:B8" 

这将创建一个名为F1的单个字段的表。您可以使用DLookup或记录集获取存储在此表中的值(您可能希望删除临时表,例如DoCmd.DeleteObject acTable, "tblTemp")。

最后,您可以使用原始问题中提到的DAO连接。您可以指定一个特定的单元格,如下所示

Dim db as DAO.Database 
Dim rsUsers as DAO.Recordset 

Set db = OpenDatabase("C:\SaleLog.xls", False, True, "Excel 8.0;HDR=Yes;") 
Set rsUsers = db.OpenRecordset("SELECT * FROM [Sales$B8:B8]") 

再次,这将创建一个名为F1的单个字段的记录集。您可以通过使用rsUsers.Fields("F1")

得到这个字段的值每上述方法可以(通常是)用于从整个工作表或单元格区域中提取数据,但对这个问题的目的,我想以展示如何将它们用于从单个单元中提取数据。我没有测试它们的效率,但我怀疑它们之间的速度差别很大,所以最好使用最简单的方法。

如果有人知道如何调整任何这些方法,使他们更有效或有另一种方法共有请随意评论或添加新的答案:)

相关问题