2014-12-24 31 views
-1

我有一個項目,我想在Excel VBA中自動報告一大堆數據。基本上我有一個1,000,000+的記錄數據庫,我想從中提取約100,000條記錄。我擁有100,000個項目的唯一方法是在Excel工作表中,我無法將其轉儲到同一個數據庫中以過濾或在同一臺服務器上的臨時表中。 有沒有辦法將Excel電子表格值視爲數據庫並在VBA中的SQL查詢中調用它?我不想使用循環,因爲數據庫響應已經足夠糟糕了。將來自兩個不同來源的百萬條記錄過濾爲100,000個

想法?

謝謝。

編輯 - 根據一個評論,我對「循環不好」的假設是不正確的。這是真的?循環訪問ID必須輪詢數據庫100,000次還是將其視爲單個數據拉?

+0

我不清楚你想要做什麼:你的標題談論2個不同的數據源,但你的問題只提到1個數據源。你想要做什麼來加入一個100K excel記錄與一個1000K記錄在數據庫中? –

+0

Excel 100k列表是一個數據源... 1m記錄位於DB2數據庫中。 100k ID駐留在1m記錄中,我正在尋找一種方法從DB2記錄集中提取100K記錄。我認爲循環會非常重要,但從下面的評論我可能是錯的。我可以通過任何方式從1m DB2記錄中獲取Excel Sheet中的100k ID,而無需將所有記錄從DB2加載到Excel中,這是我需要做的。 – JustMe

+0

我建議你的db2數據庫中的存儲過程接受一個I​​D值列表作爲輸入參數。根據您的數據庫中的要求處理值。這將是棘手的,因爲你可能會遇到某種最大允許數量。然後運行適當的查詢。在vba中,讀取帶有id字段的列,調用存儲過程,並對查詢結果進行一些操作。 –

回答

1

如果您想使用sql語法在工作簿中查詢,可以使用ADODB。

我已經包括了一個sub來作爲如何做到這一點的例子。你可以調用所述子象下面這樣:

Call queryTable("select top 100000 * from [Sheet6$A1:AI31]", range("Sheet5!A1")) 

這將查詢地處範圍Sheet6$A1:AI31(第一行是標題)數據和將轉儲開始的左上角單元格是Sheet5!A1數據。

Sub queryTable(sqlStr As String, destination As Range) 
Dim strFile As String 
Dim stADO As String 
Dim cnt     As ADODB.Connection 
Dim recordcount   As Long 
Dim fieldcount   As Long 
Dim resultrange   As Range 
Dim mydestination  As Range 

strFile = ThisWorkbook.FullName 

'connection string may need to be altered a little bit depending on your excel version 
stADO = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFile _ 
          & ";Extended Properties=""Excel 12.0;HDR=Yes;IMEX=1"";" 

Set cnt = New ADODB.Connection 

'Running query 
    With cnt 
     .CursorLocation = adUseClient 
     .Open stADO 
     .CommandTimeout = 0 
     Set rst = .Execute(sqlStr) 
    End With 

Set mydestination = destination.Cells(1, 1).Offset(1, 0) 

'Copying data (not headers) to destination 
mydestination.CopyFromRecordset rst 

'Setting some important variables 
recordcount = rst.recordcount 
fieldcount = rst.Fields.Count 

Set range_collection = Range(mydestination.Cells(1, 1).Offset(-1, 0),     mydestination.Cells(1, 1).Offset(recordcount - 1, fieldcount - 1)) 

'Copying the headers 
For i = 0 To fieldcount - 1 
mydestination.Cells(1, 1).Offset(-1, i).value = rst.Fields(i).name 
Next i 


'Closing everything down 
cnt.Close 
Set cnt = Nothing 


End Sub