Board logo

標題: Application.EnableEvents = True 失效 [打印本頁]

作者: t8899    時間: 2022-11-20 14:54     標題: Application.EnableEvents = True 失效

1.xls已開啟 Application.EnableEvents = True 作用中
開了2.xls 後, 1.xls發生事件Private Sub Worksheet_Calculate()都無法作用??

sub test()
Application.EnableEvents = False   '已測試有無此行沒差
   For Each wb In Workbooks
  If wb.Name = "2.xls" Then GoTo 58
    Next
Workbooks.Open Filename:="k:\xls3\2.xls"
58:
If Windows("2xls").Visible = False Then
Windows("2.xls").Visible = True
ElseIf Windows("2.xls").Visible = True Then
Windows("2.xls").Visible = False
End If
Application.EnableEvents = True  'event已無法作用
End Sub

要在1.xls執行
sub tes2()
Application.EnableEvents = True
end sub
才會重起作用
作者: singo1232001    時間: 2022-11-20 16:44

本帖最後由 singo1232001 於 2022-11-20 16:47 編輯

回復 1# t8899

當程序複雜到一定程度 會產生類似問題

最終解決方案就是設一個廣域變數

放在程序外

例如
public xxx as boolean
sub test()
xxx = true
end sub

這樣處理後
在觸發事件
就能用 if xxx= false then 的方式避開


但還有一種情況 比較特別  
你遇到應該是這種情況 碰到有開啟工作簿的操作
關閉的excel 本身還在背景並未真正關閉  大概就是整片都灰色的

這種方是我目前只知道一種解決方式 (或許還有更好的方法 請高手補充)

就是用set 的方式開啟工作簿 避免關閉關不乾淨
Set ob = CreateObject("Excel.Application")
ob.Visible = False
Set os = ob.Workbooks.Open(路徑)
Set osh = ob.Sheets("工作表1")
ob.ActiveWorkbook.Close
ob.Quit
Set ob = Nothing
Set os = Nothing
Set osh = Nothing
作者: t8899    時間: 2022-11-20 19:34

本帖最後由 t8899 於 2022-11-20 19:39 編輯
回復  t8899

當程序複雜到一定程度 會產生類似問題

最終解決方案就是設一個廣域變數

放在程序外 ...
singo1232001 發表於 2022-11-20 16:44

Set os = ob.Workbooks.Open(路徑)
這指令還無法開檔?請教如何開檔?
作者: singo1232001    時間: 2022-11-20 20:33

本帖最後由 singo1232001 於 2022-11-20 20:36 編輯

回復 3# t8899


    ob.Visible = False 先改成 ob.Visible = true  
若要背景處理才用
    ob.Visible = False  
我複製時忘了改

另外路徑要改成你的完整路徑 跟之前open方式的路徑一樣

最後要在注意一下    ob.Visible = False 的情況下 中斷程序 可能會卡bug
在背景沒關閉  那就得用工作管理員去關閉excel了
就如同你開啟了一個看不見的excel 卡在背景關不掉
作者: t8899    時間: 2022-11-21 06:45

本帖最後由 t8899 於 2022-11-21 06:50 編輯
回復  t8899


    ob.Visible = False 先改成 ob.Visible = true  
若要背景處理才用
    ob.Visibl ...
singo1232001 發表於 2022-11-20 20:33


1 ob.Visible = true  
這行執行完會多一個沒用的灰色視窗 (沒用到),可否省掉?

2 少一行  Public ob As Object  ?
ob.ActiveWorkbook.Close
ob.Quit
Set ob = Nothing
Set os = Nothing
Set osh = Nothing
關檔這5行放在另一巨集,無法成功 ?

3 ob.ActiveWorkbook.Close
這命令關閉會問要不要存檔??請教要存跟不要存指令如何下?
作者: singo1232001    時間: 2022-11-21 08:13

回復 5# t8899
作者: t8899    時間: 2022-11-21 12:32

我原本的問題已經解決了,開檔後暫停15秒就解決了
2.xls 裡面有940個資料交換(DDE)要等到完全更新完,才可以執行 Application.EnableEvents = True
15秒的等待,原本用DO loop,因為更新沒有順序,不知最後一筆更新是那一筆?只好抓15秒的等待時間
Workbooks.Open Filename:="k:\xls3\2.xls"
DSTOP = Now: Do While Now - DSTOP < TimeValue("0:00:15"): DoEvents: Loop '暫停15秒
多學了一個開檔的方法也不錯




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)