檔案夾下有幾百個excel,每個都有不同個數的sheet,怎么才能獲取所有的sheet名稱呢,形式最好是excel+sheet,我現在采用的是
先獲取所有excel的名稱(這個很快),然后回圈所有的excel分別執行下面的代碼
Dim XlApp As New Excel.Application
Dim XLWorkBook As New Excel.Workbook
Set XLWorkBook = XlApp.Workbooks.Open(App.Path & "\1.xls")
For i = 1 To XLWorkBook.Worksheets.Count
List1.AddItem XLWorkBook.Sheets(i).Name
Next i
XlApp.Quit
這段代碼實際上還是先把excel打開,取完sheet名稱后再關閉, 問題出來了,幾百個excel要執行兩三分鐘以上,這肯定是不行的,請問大家有沒有什么更快的方法,能取到檔案夾下所有excel的所有sheet名稱。
謝謝
uj5u.com熱心網友回復:
如果是我,我也是這么做。uj5u.com熱心網友回復:
但是Excel.Application物件只創建一次。然后就是不停的打開,關閉檔案。
uj5u.com熱心網友回復:
試試用資料庫的方式讀取或許效率好點......uj5u.com熱心網友回復:
用外部資料庫的方法應該可以快很多。首先在一個連接物件 cn 上將 Excel 檔案作為外部資料庫打開:
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=“ & App.Path & "\1.xls;Extended Properties=""Excel 8.0; HDR=Yes;IMEX=1"""
然后,在記錄集物件上打開 Schema 記錄:
Set rs = cnn1.OpenSchema(adSchemaTables)
這個記錄集中的每一條記錄的 TABLE_NAME 欄位就是一個表名。不過,要利用 TABLE_TYPE 欄位過濾掉系統表。逐條列印一下看看就知道了。
uj5u.com熱心網友回復:
XLWorkBook .close不要quit
uj5u.com熱心網友回復:
謝謝大家的幫助uj5u.com熱心網友回復:
還是解決不了啊uj5u.com熱心網友回復:
試試看:Dim XlApp As New Excel.Application
Dim XLWorkBook As New Excel.Workbook
Dim fn as String
Dim n As Long
XlApp.Visible=False
for n=1 to 100
fn=App.Path & "\"+CStr(n)+".xls"
Set XLWorkBook = XlApp.Workbooks.Open(fn)
For each in XLWorkBook.Worksheet in XLWorkBook.Sheets
debug.print fn;"+";XLWorkBook.Sheet.Name
Next
Set XLWorkBook=Nothing
XlApp.Close
next n
uj5u.com熱心網友回復:
For each in XLWorkBook.Worksheet in XLWorkBook.Sheets應改為
For each XLWorkBook.Worksheet in XLWorkBook.Sheets
uj5u.com熱心網友回復:
樓上的方法也是打開再關閉,肯定快不了uj5u.com熱心網友回復:
XlApp.Visible=False‘關閉Excel顯示以加速
for each比for快。
你確定?
不要迷信書、考題、老師、回帖;
要迷信CPU、編譯器、除錯器、運行結果。
并請結合“盲人摸太陽”和“駕船出海時一定只帶一個指南針。”加以理解。
任何理論、權威、傳說、真理、標準、解釋、想象、知識……都比不上擺在眼前的事實!
有人說一套做一套,你相信他說的還是相信他做的?
其實嚴格來說這個世界上古往今來所有人都是說一套做一套,不是嗎?
不要寫連自己也預測不了結果的代碼!
uj5u.com熱心網友回復:
Debug.Print比List1.AddItem快
uj5u.com熱心網友回復:
關鍵是我不光要把結果列印出來。我還要在下面的代碼中用到這個結果啊,只能把結果先放到list中uj5u.com熱心網友回復:
代碼不是慢在for 或for each ,而是慢在打開和關閉excel上,只要有打開關閉的動作,都快不了uj5u.com熱心網友回復:
快下班了, 來不及多說.
上次我做了一個掃描移除EXCEL宏病毒的東西, http://download.csdn.net/detail/wallescai/4349826
你打開看看吧, 應該是每個excelapp物件打開關閉一定數量的excel檔案之后最好要洗掉物件重新來一個.
應該是涉及到臨時檔案和excel本身的快取等一些東西. 我沒有深究, 只是這樣用.
當時測驗的結果是當app物件連續操作幾十個excel檔案之后(即使每次都關閉excel檔案), 反應就會越來越慢, 直到龜速.
所以對策就是開幾次之后重新建立物件.
微軟的東西不就是這樣的么, 電腦慢了重啟唄, 呵呵
uj5u.com熱心網友回復:
客戶要求這樣實作,大家幫幫忙啊uj5u.com熱心網友回復:
Option Explicit
Private Sub Command1_Click()
Dim cn As ADODB.Connection, rs As ADODB.Recordset, strFile As String
Set cn = New ADODB.Connection
strFile = Dir("c:\test\*.xls")
Do While strFile > ""
Debug.Print strFile & ":"
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\test\" & strFile & ";Extended Properties=""Excel 8.0; HDR=Yes;IMEX=1"""
Set rs = cn.OpenSchema(adSchemaTables)
Do Until rs.EOF
If rs!Table_Type = "TABLE" Then Debug.Print vbTab & rs!Table_Name
rs.MoveNext
Loop
cn.Close
strFile = Dir()
Loop
Set rs = Nothing
Set cn = Nothing
End Sub
結果
新建 Microsoft Excel 作業表.xls:
Sheet1$
Sheet2$
Sheet3$
test.xls:
作業表1$
作業表2$
作業表3$
uj5u.com熱心網友回復:
你不會放在一個字串陣列中嗎?
Const MAXN As Long=1000
Dim strarray(0 TO MAXN) as String
uj5u.com熱心網友回復:
放到不定長字串陣列也未必很快,會不斷重新分配記憶體。如果 ListBox 設定 Visible = False,應該效果差不多。uj5u.com熱心網友回復:
樓上說的對,我就是放到一個不定長陣列中的,很慢uj5u.com熱心網友回復:
為什么我執行樓上的結果是這樣的,列印了3遍,而且多了個沒有的sheet “UFPrn20130410154801”新建 Microsoft Excel 作業表.xls:
UFPrn20130410154801
Sheet1$
Sheet2$
Sheet3$
新建 Microsoft Excel 作業表.xls:
UFPrn20130410154801
Sheet1$
Sheet2$
Sheet3$
新建 Microsoft Excel 作業表.xls:
UFPrn20130410154801
Sheet1$
Sheet2$
Sheet3$
uj5u.com熱心網友回復:
自己打個斷點跟蹤一下,看是什么問題。uj5u.com熱心網友回復:
請問樓上,我新建的excel就一切正常,但是以前的excel提取時都多了這個sheet “UFPrn20130410154801”,還有我要是excel2013(后綴為.xlsx)該怎么修改呢,謝謝
uj5u.com熱心網友回復:
如果兩種擴展名的檔案都要查找,把代碼中間部分復制成兩份,其中一份改為:strFile = Dir("c:\test\*.xlsx")
......
uj5u.com熱心網友回復:
使用xlsx的話,這句話報錯cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\test\" & strFile & ";Extended Properties=""Excel 8.0; HDR=Yes;IMEX=1"""
uj5u.com熱心網友回復:
是 OLEDB.4.0 不支持 xlsx。需要更換 Provider:cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\test\" & strFile & ";Extended Properties=""Excel 12.0;HDR=YES;IMEX=1"""
uj5u.com熱心網友回復:
學習了。。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/119384.html
標籤:VB基礎類
