VB 6.0中如何訪問EXCEL 2007及EXCEL 2010

問題及分析過程


最近一段時間在使用VB 6.0開發一個OFFICE考試系統,理想的情況是支持WINDOWS XP,WINDOWS 7,WINDOWS 8,Office 2003和Office 2010。之所以,選擇VB 6主要原因是使用VBA錄製的宏可以經過簡單精簡即可應用於VB6程序中。另外,VB6的體積也小,而且其他幾位老師都易於上手。

但是,在使用VB6導入EXCEL 2010數據時卻發現了問題。直接的想法是,在窗體上添加一個ADODC控件,通過其屬性設置來訪問EXCEL 2010。於是,第一個想到的是使用Microsoft Jet 4.0 OLE DB Provider。但是,在測試連接時,總是出現錯誤提示“找不到可安裝的ISAM”,相應的英文提示是“Could not find installable ISAM”。於是搜索了許多參考答案,但是由於例子中都是訪問EXCEL 2003或者以下版本,始終找不到答案-總是出現上面的提示。根據有些網站提示,安裝了最新的VB6的SP6,也根本無濟於事。

最後,還是英文搜索幫了忙。在MSDN一個地方(http://social.msdn.microsoft.com/Forums/en-US/ae6f73a1-011f-4d8e-bcf5-80917e39ef97/could-not-find-installable-isam),描述如下:

“Jet OLEDB does not support Excel 2007 and Excel 2010 file formats. You need to install ACE OLEDB provider for it.”

這是微軟的MVP給出的描述,自然錯誤可能性很小。循着這個思路和其中提供的鏈接(http://www.microsoft.com/en-us/download/confirmation.aspx?id=13255)。我下載並安裝了其提供的Microsoft Access Database Engine 2010 Redistributable。

結果,也是令人失望。在VB6的ADODC屬性鏈接對話框中根本沒有出現上面一條,如下圖所示:




結合上述情況,我又使用中文搜索("VB 6.0如何訪問EXCEL 2010"),終於在地址http://blog.sina.com.cn/s/blog_6e001be701016yi8.html找到比較明確的參考答案。當然,這個結論與上面那個MVP提供的信息是一致的。


結論

在VB6中目前不能通過ADODC控件方式藉助JET引擎訪問EXCEL 2010,即使安裝了上述新的訪問工具(這個工具是用於VB.NET訪問新版本的EXCEL使用的)。但是,在上圖中可以使用如圖中所示的另外一種方式(Microsoft OLE DB provide for ODBC DRIVER)直接在ADODC控件中訪問EXCEL 2010(我現在就使用了這種方式)。儘管花費了不少時間,終於有一個結果,還算欣慰一些……

[補充]

很遺憾很疑惑,我在通過代碼使用ADODC控件訪問EXCEL 2010時,還是出現錯誤。相關代碼如下:

CommonDialog1.CancelError = False
    CommonDialog1.InitDir = App.Path & \"\\Data\"
    Me.CommonDialog1.Filter = \"Excel 2010(*.xlsx)|*.xlsx|Excel 2003(*.xls)|*.xls\"
    CommonDialog1.FilterIndex = 1
    
    CommonDialog1.ShowOpen

    \'e.g. \'single.xls\'
    strName = CommonDialog1.FileTitle
        Adodc1.ConnectionString = \"Provider=MSDASQL.1;Persist Security Info=False;Data Source=Excel Files;Initial Catalog=\" & App.Path & strName
        Adodc1.CommandType = adCmdText
        Adodc1.RecordSource = \"Select * from [Sheet1$]\"
        
        Adodc1.Refresh

運行過程中出現具體錯誤提示如下圖所示(答案正在尋找中……)




[問題解決]

其實,上面的表達方式基本沒有問題,只是最後一句不能在此調用。典型情況下,上述代碼應當是在Form_Load方法中調用的。於是,應當在Form_Activate方法中調用Adodc1.Refresh方法。如此,一切OK!

當然,如果你想使用Adodc1.CommandType = adCmdTable,那麼Adodc1.RecordSource =”[Sheet1$]"也可以。

至此,問題解決!最終實現了使用VB6(+SP6)訪問EXCEL 2010,對於EXCEL 2007雖然沒有試驗,但估計也是沒有問題的!


[補充]

文章http://www.excelpx.com/thread-228696-1-1.html處提供了較細緻的訪問方法,只可以估計是針對VB.NET的方案,根本不適合VB6.


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章