Ahm*_*mad 7 c# excel vsto excel-2007
每天,一个人需要检查特定工作簿是否已经使用彭博和路透社的市场数据进行了正确更新; 即所有数据都已通过并且"数字看起来正确".在过去,人们没有检查导致上传到其他系统的"数字"不正确.
我们的想法是,需要开发"某些东西"以防止使用关闭/保存工作簿,除非他/她已检查更新是否正确/准确.该numbers look correct动作纯粹是一种直观的练习,因此不会以任何方式编码.
简单的解决方案是在关闭特定工作簿之前提示用户验证数据是否已被检查.
使用VSTO SE for Excel 2007,创建了一个加载项,该加载项挂接到WorkbookBeforeClose在加载项中初始化的事件ThisAddIn_Startup
private void wb_BeforeClose(Xl.Workbook wb, ref bool cancel)
{
//.... snip ...
if (list.Contains(wb.Name))
{
DailogResult result = MessageBox.Show("some message", "sometitle", MessageBoxButtons.YesNo);
if (result != DialogResult.Yes)
{
cancel = true; // i think this prevents the whole application from closing
}
}
}
Run Code Online (Sandbox Code Playgroud)
我发现以下ThisApplication.WorkbookBeforeSavevsThisWorkbook.Application.WorkbookBeforeSave建议人们应该使用ThisApplication.WorkbookBeforeClose我认为正在做的事件,因为它将跨越所有打开的文件.
我对该方法的问题是假设我打开了几个文件,其中一些文件在我的文件中list,该事件阻止Excel按顺序关闭所有文件.现在需要单独关闭每个文件.编辑:从文件菜单中使用退出Excel时会发生这种情况.
问题
WorkbookBeforeClose是否正确使用了该活动,是否有效且高效地使用了该活动?更新[2010年3月30日]:
摆弄,我也试过以下尝试将BeforeClose 事件处理程序绑定到上面链接建议打开的每个工作簿.
private void ThisAddIn_Startup(...)
{
// snip
Globals.ThisAddin.Application.WorkbookOpen += Application_Open;
}
private void Application_Open(XL.Workbook wb)
{
wb.BeforeClose += Document_WorkbookBeforeClose; // method does the same as above
}
Run Code Online (Sandbox Code Playgroud)
我在这种方法中发现的问题是,我尝试关闭所有Excel文件(使用退出Excel选项),事件处理程序不执行.根据我的观察,当要检查的文档不是活动文档时会发生这种情况.
与我的初始方法相比,这种方法似乎不稳定.我不确定或感觉舒服的一件事是每次打开文档时绑定事件.
更新[2010年4月7日]:
Glen的建议答案很有用,但没有解决眼前的问题,因此我进一步澄清了最后一个问题.
我还发现了这个博客如何获取Excel VSTO工作簿已关闭事件,这与我的问题有些相关,因为它可以在我的解决方案的替代方法中使用监视器类型方法来处理工作簿(并且可能还使用新推出的OnWorkbookClosed活动).
更新[2010年4月8日]:
似乎有些混乱,我不关心工作簿本身的任何验证,而是我正在使用的方法(即使用应用程序级WorkbookBeforeClose事件)是否正确.@Mathias在下面的评论显示了对问题3的部分问题的正确理解,我认为这是默认的excel行为.解决此问题的解决方案是创建一个仅关闭我的特定文件的close函数.
- 上述行为是否正常?是的,但是为什么? 由于加载项挂钩到应用程序级事件中,因此事件的检查和取消会阻止应用程序关闭任何其他工作簿.这里的关键是
ref bool cancel参数(cancel=false允许正常关闭工作簿(默认),cancel=true防止工作簿关闭)
VS 2005与VSTO SE
应用程序级别WorkbookBeforeClose是要使用的级别.问题是,WorkbookBeforeClose调用时文件未被保存会导致不稳定的行为.如果不是,则保存事件将启动,您现在已经有效地丢失了该WorkbookBeforeClose事件,因为它已经发生.这里有一些VBA代码可以帮助解决这个问题.
Private Sub Workbook_BeforeClose(Cancel As Boolean)
If Not Me.Saved Then
NotSavedPrompt = Me.Name & " has not been saved. Would you like to save now?"
SaveYesNo = MsgBox(NotSavedPrompt, vbQuestion + vbYesNoCancel)
Select Case SaveYesNo
Case vbYes
Me.Save
Case vbNo
Me.Saved = True
Case vbCancel
Cancel = True
Exit Sub
End Select
End If
Call MyRoutine() //'this should be your sub that does what you want
End Sub
Run Code Online (Sandbox Code Playgroud)