繁体   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