大家好,今日我們繼續講解VBA資料庫解決方案,今日講解第35講:利用ADO,實現EXCEL多個工作表數據的匯總。在前幾講中,我們講了用ADO連接EXCEL實現一些便捷操作的方法,其實,這些操作中是把EXCEL作為一種特殊的資料庫來對應的,我們在實際工作中面臨的實際情況多種多樣,要實現特殊的操作有時要組合利用一些基本的方法。
我們今日講解的是利用ADO,實現EXCEL多個工作表數據的匯總,模擬的場景是某個工作薄中有若干個工作表,我們要把這些工作表的數據一次提取出來,放在當前的工作表內。如下面的截圖;為文件「16年.xlsx」 的數據記錄,一共有4個工作表,每個工作表中的記錄各不相同:
為了實現各個工作表中的數據都匯總到同一個工作表中,我們看下面的代碼:
Sub mynzexcels_4()
'第35講,利用ADO,實現EXCEL多個工作表數據的匯總
Dim cnADO, rsADO As Object
Dim strPath, strTable, strSQL As String
Dim SH As Worksheet
ThisWorkbook.ActiveSheet.Cells.Clear
Set cnADO = CreateObject("ADODB.Connection")
'建立連接
strPath = ThisWorkbook.Path & "\" & "16年.xlsx"
Workbooks.Open strPath
cnADO.Open "provider=Microsoft.ACE.OLEDB.12.0;extended properties='excel 8.0;hdr=no;imex=1';data source=" & strPath
For Each SH In Worksheets
strTable = "[" & SH.Name & "$]"
strSQL = "select * from " & strTable
ThisWorkbook.ActiveSheet.Range("a65536").End(xlUp).Offset(1, 0).CopyFromRecordset cnADO.Execute(strSQL)
Next
Workbooks("16年").Close
cnADO.Close
Set cnADO = Nothing
End Sub
代碼截圖:
代碼講解:
1 Workbooks.Open strPath 這裡要打開這個文件,以便提取每個工作表的數據,如果不打開時下面的FOR EACH會報錯。
2 strTable = "[" & SH.Name & "$]"
strSQL = "select * from " & strTable
上述代碼是嵌套在for each 循環中,先提取每個工作表的名字,然後建立SQL可執行的語句。
3 ThisWorkbook.ActiveSheet.Range("a65536").End(xlUp).Offset(1, 0).CopyFromRecordset cnADO.Execute(strSQL)
將數據提取處來放到當前的工作表中,這處是執行了一個SQL語句。
4 Workbooks("16年").Close 關閉這個文件。這處可以用Workbooks("16年").Close(false),較好。
下面看我們代碼的執行過程:
點擊」多工作表的數據匯總」:
這樣就實現了我們的目的:多個工作表的數據匯總。
今日內容回向:
1 如何實現多個工作表的匯總?
2 為啥要先打開這個文件呢?