*-* 请大家看看这两种写法有什么不同,set excel对象为nothing了,在进程中还有EXCEL!

sytxzg 2008-04-28 10:49:12
Dim excel_App As Excel.Application
Dim excel_Book As Excel.Workbook
Dim excel_sheet As Excel.Worksheet

Set excel_App = CreateObject("Excel.Application")
Set excel_Book = excel_App.Workbooks.Open("c:\sss.xls")
Set excel_sheet = excel_Book.Worksheets(1)

excel_sheet.Cells(1, 4) = "随便写点什么"
excel_sheet.Range("D2").Select

'如果把上面两句写改成 下面两句,在执行完,Excel进程在进程中不退出(只有关闭整个VB程序,才会退出),不知是为什么?
'Cells(1, 4) = "随便写点什么"
'Range("D2").Select

MsgBox "请查看进程中是否有EXCEL进程!"


excel_App.ActiveWorkbook.Close True 'False '是否对EXCELL进行更改。
excel_App.Quit
Set excel_sheet = Nothing
Set excel_App = Nothing

MsgBox "释放完毕!请查看进程中是否有EXCEL进程!"

'Set excel_sheet = Nothing
'Set excel_Book = Nothing
'excel_App.Quit
'Set excel_App = Nothing
...全文
179 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
knowledge_Is_Life 2008-04-29
  • 打赏
  • 举报
回复
接分先!
sytxzg 2008-04-28
  • 打赏
  • 举报
回复
excel_sheet.Cells(1, 4) = "随便写点什么"
excel_sheet.Range("D2").Select

'如果把上面两句写改成 下面两句,在执行完,Excel进程在进程中不退出(只有关闭整个VB程序,才会退出),不知是为什么?
'Cells(1, 4) = "随便写点什么"
'Range("D2").Select
ChinaOBS 2008-04-28
  • 打赏
  • 举报
回复
哪2种写法?

excel_App.Quit 必须这样才能退出!
gracexu 2008-04-28
  • 打赏
  • 举报
回复
楼主这个问题说来话长,但是同样的问题很多人都问了,我今天身边没有windows,只好讲讲道理,不能提供代码。
Office的程序是基于COM 的,每个COM 对象要维护一个引用计数,如果计数为零就释放掉了。
如果代码里对COM 对象的调用不规范,就会产生你不知道的引用,你也没有专门释放它,结果就是留在内存里。
下面一段话是MSDN中的,希望对你有用。
Marshal.ReleaseComObject 方法. 递减所提供的运行库可调用包装的引用计数。 命名空间:System.Runtime.InteropServices 程序集:mscorlib(在mscorlib.dll 中)
舉杯邀明月 2008-04-28
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 sytxzg 的回复:]
你好gracexu:
感谢你的回贴,

如果要 释放你所说的后台生成的activesheet对象,要怎么释放?我怎么知道它有没有后台生成activesheet对象呢?


还有,以下三句是我从宏中copy过来的,range我知道前面要加execl_sheet了,但不知第2句的selection前面要加什么?
Range("B1").Select
Selection.AutoFill Destination:= Range("B1:B8"), Type:=xlFillDefault
Range("B1:B8").Select

[/Quote]

Selection 就是指:当前活动工作表的被选定单元格。它的前面,要加的话,可能是Application对象。
ChinaOBS 2008-04-28
  • 打赏
  • 举报
回复
Range("B1").Select
Selection.AutoFill Destination:= Range("B1:B8"), Type:=xlFillDefault
======================================================================

可以合并成一句:
Range("B1").AutoFill Destination:= Range("B1:B8"), Type:=xlFillDefault
sytxzg 2008-04-28
  • 打赏
  • 举报
回复
你好gracexu:
感谢你的回贴,

如果要 释放你所说的后台生成的activesheet对象,要怎么释放?我怎么知道它有没有后台生成activesheet对象呢?


还有,以下三句是我从宏中copy过来的,range我知道前面要加execl_sheet了,但不知第2句的selection前面要加什么?
Range("B1").Select
Selection.AutoFill Destination:= Range("B1:B8"), Type:=xlFillDefault
Range("B1:B8").Select
舉杯邀明月 2008-04-28
  • 打赏
  • 举报
回复
不太明白,但觉得不加具体的对象,感觉是有点不妥当。

gracexu 2008-04-28
  • 打赏
  • 举报
回复
你是想知道为什么加不加不一样啊.
加了就明确指定你生成的sheet对象,所有的操作占用资源没有越出这个对象空间.

但是你不加的话,有个后台生成的activesheet对象,这个对象会和你命名的对象指向同样的空间,但是它本身也是占空间的,而你又没有释放它.
sytxzg 2008-04-28
  • 打赏
  • 举报
回复
Cells,Range 前不加excel_sheet和加excel_sheet不一样的.
不加时
在释放excel对象后,在进程中还有EXCEL.

5,140

社区成员

发帖
与我相关
我的任务
社区描述
其他开发语言 Office开发/ VBA
社区管理员
  • Office开发/ VBA社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧