Discussion:
vb.net 執行createobject ("excel.application") 後記憶體釋放問題
(时间太久无法回复)
P陳
2005-11-08 06:52:02 UTC
Permalink
當執行多次
xlsobject=createobject("excel.application")
.
.
.
xlsobject.application.quit 後,電腦告知記憶體不足,
叫出 工作管理員 在處理序中有數個 excel 導致記憶體不足,
請問要下什麼指令才能將exce 所佔的記憶體釋放出來呢?
chijanzen
2005-11-08 12:30:02 UTC
Permalink
你好:

要釋放記憶體的方法請參考

xlsobject=createobject("excel.application")
.
.
.
xlsobject.Quit
Set xlsobject=Nothing
--
天行健,君子以自強不息
地勢坤,君子以厚德載物

http://www.vba.com.tw/plog/


"P陳" 來函:
Post by P陳
當執行多次
xlsobject=createobject("excel.application")
.
.
.
xlsobject.application.quit 後,電腦告知記憶體不足,
叫出 工作管理員 在處理序中有數個 excel 導致記憶體不足,
請問要下什麼指令才能將exce 所佔的記憶體釋放出來呢?
P陳
2005-11-08 12:58:04 UTC
Permalink
謝謝您
不過還是每執行一次 就增加一個執行的 excel
存檔時還是會出現 resume.xlw 已存在是否要覆寫的訊息

另 vb.net 不是不用set 了嗎? set 打下去就自動不見了

Dim XlsObject As Object
XlsObject = CreateObject("Excel.Application")
XlsObject.workbooks.open(Filename:="D:\temp\excel3.xls")
XlsObject.application.visible = True
XlsObject.Sheets("sheet1").Range("a1") = "test"
XlsObject.sheets("sheet1").range("b1") = "'1989"
XlsObject.save()
'XlsObject.application.quit()
XlsObject.quit()
XlsObject = Nothing
crdotlin
2005-11-08 14:29:05 UTC
Permalink
我沒用過VB.NET依照您的意思改寫
Dim XlsObject As Object
XlsObject = CreateObject("Excel.Application")
With XlsObject
.workbooks.open(Filename:="D:\temp\excel3.xls")
.visible = True
With .workbooks(“excel3.xls”)
.Sheets("sheet1").Range("a1") = "test”
.sheets("sheet1").range("b1") = "'1989"
.close savechanges:=true
End with
.quit
End with
XlsObject = Nothing
此敘述 XlsObject.save()
為造成儲存環境變數的因素. 取消後就不會了
請參考
--
http://crdotlin.vgocities.net/plog/


"P陳" 來函:
Post by P陳
謝謝您
不過還是每執行一次 就增加一個執行的 excel
存檔時還是會出現 resume.xlw 已存在是否要覆寫的訊息
另 vb.net 不是不用set 了嗎? set 打下去就自動不見了
Dim XlsObject As Object
XlsObject = CreateObject("Excel.Application")
XlsObject.workbooks.open(Filename:="D:\temp\excel3.xls")
XlsObject.application.visible = True
XlsObject.Sheets("sheet1").Range("a1") = "test"
XlsObject.sheets("sheet1").range("b1") = "'1989"
XlsObject.save()
'XlsObject.application.quit()
XlsObject.quit()
XlsObject = Nothing
P陳
2005-11-09 14:55:02 UTC
Permalink
crdotlin 您好:
  謝謝您的解答
您的答案是正解之一,但
Post by crdotlin
此敘述 XlsObject.save()
為造成儲存環境變數的因素. 取消後就不會了
經過反覆確認 SAVE()並不是造成不會釋放記憶體的原因
而是 GC.Collect() 才能將記憶體釋放出來,且如果沒有設成 XlsObject=Nothing
的話還是不會釋放記憶體的,如下寫的話就沒問題,也不會再出現 resume.xlw 已存在是否要覆蓋的訊息
XlsObject.DisplayAlerts = False
XlsObject.save()
XlsObject.DisplayAlerts = TRUE
XlsObject.quit()  不影響記憶體釋放
XlsObject = Nothing
GC.Collect()
chijanzen
2005-11-08 14:41:02 UTC
Permalink
你好:

請參考以下程式碼

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
Dim XlsObject As Object
On Error Resume Next
XlsObject = GetObject(, "Excel.Application")
If Err.Number <> 0 Then
XlsObject = CreateObject("Excel.Application")
End If
XlsObject.Application.Visible = True
XlsObject.workbooks.open(Filename:="C:\test.xls")
XlsObject.Sheets("sheet1").Range("a1") = "test"
XlsObject.sheets("sheet1").Range("b1") = "'1989"
XlsObject.save()
XlsObject.quit()
XlsObject = Nothing
GC.Collect()
End Sub
--
天行健,君子以自強不息
地勢坤,君子以厚德載物

http://www.vba.com.tw/plog/


"P陳" 來函:
Post by P陳
謝謝您
不過還是每執行一次 就增加一個執行的 excel
存檔時還是會出現 resume.xlw 已存在是否要覆寫的訊息
另 vb.net 不是不用set 了嗎? set 打下去就自動不見了
Dim XlsObject As Object
XlsObject = CreateObject("Excel.Application")
XlsObject.workbooks.open(Filename:="D:\temp\excel3.xls")
XlsObject.application.visible = True
XlsObject.Sheets("sheet1").Range("a1") = "test"
XlsObject.sheets("sheet1").range("b1") = "'1989"
XlsObject.save()
'XlsObject.application.quit()
XlsObject.quit()
XlsObject = Nothing
chijanzen
2005-11-08 15:26:09 UTC
Permalink
你好:

再加上不再顯示是否要覆蓋Resume.xlw的程式碼

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
Dim XlsObject As Object
On Error Resume Next
XlsObject = GetObject(, "Excel.Application")
If Err.Number <> 0 Then
XlsObject = CreateObject("Excel.Application")
End If
XlsObject.Application.Visible = True
XlsObject.workbooks.open(Filename:="C:\test.xls")
XlsObject.Sheets("sheet1").Range("a1") = "test"
XlsObject.sheets("sheet1").Range("b1") = "'99999"
XlsObject.DisplayAlerts = False
XlsObject.save()
XlsObject.DisplayAlerts = True
XlsObject.quit()
XlsObject = Nothing
GC.Collect()
End Sub
--
天行健,君子以自強不息
地勢坤,君子以厚德載物

http://www.vba.com.tw/plog/


"chijanzen" 來函:
Post by chijanzen
請參考以下程式碼
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
Dim XlsObject As Object
On Error Resume Next
XlsObject = GetObject(, "Excel.Application")
If Err.Number <> 0 Then
XlsObject = CreateObject("Excel.Application")
End If
XlsObject.Application.Visible = True
XlsObject.workbooks.open(Filename:="C:\test.xls")
XlsObject.Sheets("sheet1").Range("a1") = "test"
XlsObject.sheets("sheet1").Range("b1") = "'1989"
XlsObject.save()
XlsObject.quit()
XlsObject = Nothing
GC.Collect()
End Sub
--
天行健,君子以自強不息
地勢坤,君子以厚德載物
http://www.vba.com.tw/plog/
"P陳" 來函:
Post by P陳
謝謝您
不過還是每執行一次 就增加一個執行的 excel
存檔時還是會出現 resume.xlw 已存在是否要覆寫的訊息
另 vb.net 不是不用set 了嗎? set 打下去就自動不見了
Dim XlsObject As Object
XlsObject = CreateObject("Excel.Application")
XlsObject.workbooks.open(Filename:="D:\temp\excel3.xls")
XlsObject.application.visible = True
XlsObject.Sheets("sheet1").Range("a1") = "test"
XlsObject.sheets("sheet1").range("b1") = "'1989"
XlsObject.save()
'XlsObject.application.quit()
XlsObject.quit()
XlsObject = Nothing
P陳
2005-11-09 14:32:55 UTC
Permalink
感謝 chijanzen 及 crdotlin 兩位大大的協助,大方向問題已解決了,
但是像這些 
gc.collect
XlsObject.DisplayAlerts = True
等等的東西要在那裏看得到呢?有書可買嗎?不然如我瞎子摸像那摸得出來
chijanzen
2005-11-09 15:02:13 UTC
Permalink
你好:

想要直接從 VB.NET 對Excel 進行程式碼的操作
如果對於 VBA 程式碼不太懂的話,的確是有很大的困難
建議你先從 Excel VBA 程式碼來做,然後再轉成 VB.NET的語法
這樣會簡單一些。

多多使用Excel 錄製巨集的功能及 F1 鍵(選取程式碼後按F1鍵,可以顯示該程式碼的說明)
很多就能上手了
--
天行健,君子以自強不息
地勢坤,君子以厚德載物

http://www.vba.com.tw/plog/


"P陳" 來函:
Post by P陳
感謝 chijanzen 及 crdotlin 兩位大大的協助,大方向問題已解決了,
但是像這些 
gc.collect
XlsObject.DisplayAlerts = True
等等的東西要在那裏看得到呢?有書可買嗎?不然如我瞎子摸像那摸得出來
P陳
2005-11-10 02:39:04 UTC
Permalink
您好:
  在VBA上之前一直在用ACCESS,,(最近因故轉用 vb.net
加 excel的模組)在其上只要打入了指令就會出現方法屬性等來供選擇,但 Excel 上好像不會出現,而且
1。excel 錄製的的模組抄到vb.net 還要轉換才能使用不能直接套用
2。像不要出現 resume.xlw 訊息的指令跟本就不可能猜的出來(xlsobject.DisplayAlerts = false)
3。像 GC.Collect() 指令 文字方塊的textframe 關鍵字 也不知您是從那翻出來的
所以目前最大的困難點是在於不知有那些屬性、方法可使用,而不是不會用,才請教有什麼書可看?
謝謝     




"chijanzen" 來函:
Post by chijanzen
想要直接從 VB.NET 對Excel 進行程式碼的操作
如果對於 VBA 程式碼不太懂的話,的確是有很大的困難
建議你先從 Excel VBA 程式碼來做,然後再轉成 VB.NET的語法
這樣會簡單一些。
多多使用Excel 錄製巨集的功能及 F1 鍵(選取程式碼後按F1鍵,可以顯示該程式碼的說明)
很多就能上手了
--
天行健,君子以自強不息
地勢坤,君子以厚德載物
http://www.vba.com.tw/plog/
"P陳" 來函:
Post by P陳
感謝 chijanzen 及 crdotlin 兩位大大的協助,大方向問題已解決了,
但是像這些 
gc.collect
XlsObject.DisplayAlerts = True
等等的東西要在那裏看得到呢?有書可買嗎?不然如我瞎子摸像那摸得出來
Loading...