一、問(wèn)題:
使用如下代碼打開、取值及關(guān)閉excel:
Public Function ImportFromExcel(excelFile As String) As Long
Dim xlApp As Excel.Application
Dim xlBook As Excel.Workbook
Dim xlSheet As Excel.Worksheet
Dim strCardNo As String
Set xlApp = New Excel.Application '連接EXCEL程序,或是用Set xlApp = CreateObject("Excel.Application")
xlApp.DisplayAlerts = False
Set xlBook = xlApp.Workbooks.Open(excelFile) '打開EXCEL文件
Set xlSheet = xlBook.Sheets(1) '打開第一頁(yè)(sheet)
strCardNo = Trim(xlSheet.Cells(2, 3)) '示例,取第2行的第3列,即C2單元格的值
'進(jìn)行其他的處理
'......
'處理完成
Set xlSheet = Nothing '釋放sheet對(duì)象
xlBook.Close '關(guān)閉文件
Set xlBook = Nothing
xlApp.Quit '關(guān)閉Excel
Set xlApp = Nothing
代碼執(zhí)行完成以后,會(huì)發(fā)現(xiàn)在任務(wù)管理器中,excel進(jìn)程仍然存在,而且通過(guò)這個(gè)方法打開的excel文件,無(wú)法再在windows的文件夾里通過(guò)雙擊打開了。
二、調(diào)試分析
將中間取值及處理的所有代碼屏蔽,只執(zhí)行打開及關(guān)閉部分的代碼,會(huì)發(fā)現(xiàn)代碼執(zhí)行完成以后,excel成功地關(guān)閉了,因此,問(wèn)題應(yīng)該出在對(duì)excel文件的處理中。按照面向?qū)ο蟮乃悸罚褂?strCardNo = xlSheet.Cells(2, 3) 取值時(shí),理論上應(yīng)該是得到了一個(gè)單元格的實(shí)例,而不單單是這個(gè)單元格的值,只是vb在使用strCardNo時(shí),只使用了它的值而已,因此,懷疑是因?yàn)閟trCardNo(或是其對(duì)應(yīng)的單元格實(shí)例)在使用完成后,沒(méi)有得到釋放,因此,windows沒(méi)有正常關(guān)閉excel文件并銷毀excel進(jìn)程。
三、解決
但通過(guò)在Cells(2, 3)后面使用“.”提示符,沒(méi)有發(fā)現(xiàn)有屬性可以只取得單元格的值。但Excel.Worksheet有另外一個(gè)成員Range,它有一個(gè)value屬性,猜測(cè)應(yīng)該是取值用的,因此將代碼修改如下:
Set xlApp = New Excel.Application '連接EXCEL程序,或是用Set xlApp = CreateObject("Excel.Application")
xlApp.DisplayAlerts = False
Set xlBook = xlApp.Workbooks.Open(excelFile) '打開EXCEL文件
Set xlSheet = xlBook.Sheets(1) '打開第一頁(yè)(sheet)
strCardNo = Trim(xlSheet.Range("C2").value) '區(qū)域C2的值
'進(jìn)行其他的處理
'......
'處理完成
Set xlSheet = Nothing '釋放sheet對(duì)象
xlBook.Close '關(guān)閉文件
Set xlBook = Nothing
xlApp.Quit '關(guān)閉Excel
Set xlApp = Nothing
其中,打開及處理、關(guān)閉的代碼沒(méi)有作任何更改,只是將
strCardNo = Trim(xlSheet.Cells(2, 3))
改為了
strCardNo = Trim(xlSheet.Range("C2").value)
代碼執(zhí)行完成以后,excel被正常關(guān)閉,excel文件也可以通過(guò)雙擊正常打開。
四、總結(jié)
問(wèn)題出現(xiàn)后,也從網(wǎng)上查過(guò)解決方法,遇到這種問(wèn)題的程序員很多。excel的打開及關(guān)閉部分,各人使用的方法都不太一樣,但好像問(wèn)題并不是出在這里,從個(gè)人的經(jīng)歷來(lái)看,實(shí)際大部分可能應(yīng)該是在對(duì)excel的操縱部分出現(xiàn)的問(wèn)題。
原址:http://blog.163.com/shuangfeng_521/blog/static/20017737201422972612657/
聯(lián)系客服