[英]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.