VB之操作excel后不能关闭excel进程的原因及解决方法

4 篇文章 0 订阅

一、问题:

使用如下代码打开、取值及关闭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)          '打开第一页(sheet)

strCardNo = Trim(xlSheet.Cells(2, 3))  '示例,取第2行的第3列,即C2单元格的值

'进行其他的处理

'......

'处理完成

 


Set xlSheet = Nothing '释放sheet对象

xlBook.Close '关闭文件

Set xlBook = Nothing

xlApp.Quit '关闭Excel

Set xlApp = Nothing

 

代码执行完成以后,会发现在任务管理器中,excel进程仍然存在,而且通过这个方法打开的excel文件,无法再在windows的文件夹里通过双击打开了。

二、调试分析

将中间取值及处理的所有代码屏蔽,只执行打开及关闭部分的代码,会发现代码执行完成以后,excel成功地关闭了,因此,问题应该出在对excel文件的处理中。按照面向对象的思路,使用 strCardNo = xlSheet.Cells(2, 3) 取值时,理论上应该是得到了一个单元格的实例,而不单单是这个单元格的值,只是vb在使用strCardNo时,只使用了它的值而已,因此,怀疑是因为strCardNo(或是其对应的单元格实例)在使用完成后,没有得到释放,因此,windows没有正常关闭excel文件并销毁excel进程。

三、解决

但通过在Cells(2, 3)后面使用“.”提示符,没有发现有属性可以只取得单元格的值。但Excel.Worksheet有另外一个成员Range,它有一个value属性,猜测应该是取值用的,因此将代码修改如下:

 


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)          '打开第一页(sheet)

strCardNo = Trim(xlSheet.Range("C2").value)  '区域C2的值

'进行其他的处理

'......

'处理完成

 


Set xlSheet = Nothing '释放sheet对象

xlBook.Close '关闭文件

Set xlBook = Nothing

xlApp.Quit '关闭Excel

Set xlApp = Nothing

 

其中,打开及处理、关闭的代码没有作任何更改,只是将

strCardNo = Trim(xlSheet.Cells(2, 3))

改为了

strCardNo = Trim(xlSheet.Range("C2").value)

 

代码执行完成以后,excel被正常关闭,excel文件也可以通过双击正常打开。

四、总结

问题出现后,也从网上查过解决方法,遇到这种问题的程序员很多。excel的打开及关闭部分,各人使用的方法都不太一样,但好像问题并不是出在这里,从个人的经历来看,实际大部分可能应该是在对excel的操纵部分出现的问题。

 

 

原址:http://blog.163.com/shuangfeng_521/blog/static/20017737201422972612657/

 

  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值