2017-02-23 52 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")

得到這個字段的值每上述方法可以(通常是)用於從整個工作表或單元格區域中提取數據,但對這個問題的目的,我想以展示如何將它們用於從單個單元中提取數據。我沒有測試它們的效率,但我懷疑它們之間的速度差別很大,所以最好使用最簡單的方法。

如果有人知道如何調整任何這些方法,使他們更有效或有另一種方法共有請隨意評論或添加新的答案:)

相關問題