确定Popup是否在Excel的前景中

时间:2011-12-28 22:20:14

标签: excel vsto office-interop

我正在为Excel编写VSTO加载项,我注意到如果我锁定工作表并使用密码保护它(因此只有我的加载项可以写入,但用户可以查看它),如果用户试图编辑他们得到的表单"此表被锁定"弹出。如果该提示仍在等待用户输入,则加载项尝试写入工作表,Excel崩溃。写入表单的行为包括取消保护,写入数据,然后再次锁定它。外接程序通过串口从外部源捕获数据,因此可以随时写入数据。

要重新创建: 1.带有插件的锁定表。 2.用户尝试编辑工作表内容 3.系统提示用户无法编辑工作表的内容,因为它已被锁定。 4.数据来自串行端口,加载项尝试解锁,写入数据并锁定工作表,然后用户有机会确认被抛出的提示。 Excel表示灰尘。

有什么建议吗?我一直在想要保持一个隐藏的"主人"工作表和可见工作表,只使用excel公式或命名范围来引用隐藏工作表。然而,这将对用户进行编辑和潜在的数据损坏开放。数据必须尽可能不可编辑。

更新:我会对捕获COMException感到满意,因此它不会杀死excel,但是一般" catch(Exception ex)"似乎没有帮助。

4 个答案:

答案 0 :(得分:1)

在VBA中,您可以使用UserInterFaceOnly:= True保护工作表。这意味着代码仍然可以写入工作表。 From this link看起来VSTO插件也是如此。

答案 1 :(得分:1)

您可以进行检查以确保工作表处于交互模式或活动单元格不为空,如果检查失败则执行写入操作的退出函数

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

答案 2 :(得分:1)

问题显然是

catch(Exception)
当涉及到COMException时,

不能作为一般捕获。添加行

using System.Runtime.InteropServices;

然后添加

catch(COMException)

我的尝试... catch块让我更好地处理错误。使用

将其与某些代码混合以重试失败的操作几次
SendKeys.SendWait("{ESC}");

似乎让事情变得更好。然而,盲目地将转义密钥发送到最前端程序可能会导致一些问题,但是我无法坐在无休止的循环中等待可能会或可能不会注意清除屏幕上的问题的用户。它似乎导致串口停止缓冲数据,如果处理速度不够快就丢弃它。

答案 3 :(得分:1)

不是在点击单元格上执行此操作,而是可以在功能区中添加一个按钮,并在其单击时执行此任务,这样就可以摆脱弹出窗口