簡體   English   中英

確定彈出窗口是否在Excel的前景中

[英]Determine if Popup is in foreground of Excel

我正在為Excel編寫VSTO加載項,並且我注意到,如果用戶嘗試編輯該表並對其進行密碼保護(因此只有我的加載項可以寫入,但用戶可以查看),他們收到“此工作表已鎖定”的工作表彈出窗口。 如果在該提示仍在等待用戶輸入時,該加載項嘗試寫入工作表,則Excel崩潰。 寫入工作表的操作包括取消保護工作表,寫入數據,然后再次鎖定它。 外接程序通過串行端口從外部源捕獲數據,因此可以隨時寫入數據。

要重新創建:1.鎖定帶有加載項的工作表。 2.用戶嘗試編輯工作表內容。3.提示用戶無法編輯工作表內容,因為它已被鎖定。 4.數據進入串行端口,並且在用戶有機會確認所引發的提示之前,加載項會嘗試解鎖,寫入數據和鎖定工作表。 5. Excel清除灰塵。

有什么建議么? 我一直在想維護一個隱藏的“主”表和可見表,而只是使用一個excel公式或命名范圍來引用該隱藏表。 但是,這將對用戶進行編輯和潛在的數據破壞開放。 數據必須盡可能不可編輯。

更新:我對捕獲COMException非常滿意,因此它不會殺死excel,但是常規的“ catch(ex ex ex)”似乎沒有幫助。

在VBA中,您可以使用UserInterFaceOnly:= True保護工作表。 這意味着代碼仍然可以寫入工作表。 從該鏈接看來,VSTO插件也是如此。

如果檢查失敗退出執行寫操作的退出功能,則可以進行檢查以確保工作表處於交互模式或活動單元不為空

 private bool IsExcelInteractive()
    {
        try
        {
            Globals.ThisAddIn.Application.Interactive = Globals.ThisAddIn.Application.Interactive;
            return true;
        }
        catch
        {
            return false;
        }
    }

問題顯然是

catch(Exception)

當涉及到COMException時,它不能作為通用功能。 添加線

using System.Runtime.InteropServices;

然后添加

catch(COMException)

我的嘗試... catch塊使我可以更好地處理錯誤。 使用后,將其與一些代碼混合以重試失敗的操作幾次

SendKeys.SendWait("{ESC}");

似乎使事情變得更好。 但是,盲目地將轉義鍵發送到最前端的程序可能會導致一些問題,但是我不能無休止地等待用戶,他們可能會或可能不會注意在屏幕上清除問題。 似乎導致串行端口停止緩沖數據,如果處理速度不夠快,則將其丟棄。

您可以在功能區中添加一個按鈕,然后單擊它來執行此任務,而不是在單擊單元格時執行此操作,這樣就可以擺脫彈出窗口

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM