【问题标题】:Best Practices to handle multiple open workbooks in an Excel VSTO add-in在 Excel VSTO 加载项中处理多个打开的工作簿的最佳做法
【发布时间】:2013-03-29 04:38:35
【问题描述】:

我正在 VB.Net 中开发 Excel VSTO 加载项。鉴于用户可能在使用我的主窗体之前、之后或期间打开或关闭许多工作簿,我正在尝试解决知道我的加载项应该影响哪个工作簿的问题。

主要功能都围绕着编辑一个主模板文件,用户可能会使用有用的名称保存该文件,并且可能会返回以供参考或进一步编辑。加载项打开一个表单并执行各种功能,例如将信息从数据库添加到工作表,或将工作表添加到工作簿(以及大量统计信息)。我所做的大部分工作都依赖于调用特定的工作簿:

        CurrentRun = Marshal.GetActiveObject("Excel.Application")
        CurrentBook = CurrentRun.Workbooks(CurrentIndex)

其中CurrentIndex 是组合框中的索引,该组合框使用当前打开的工作簿的名称填充/更新:

    ...
    ControlCurrentWBComboBox.Items.Clear()
    CurrentRun = Marshal.GetActiveObject("Excel.Application")
    For n = 1 To CurrentRun.Workbooks.Count()
        ControlCurrentWBComboBox.Items.Add(CurrentRun.Workbooks(n).Name)
    Next
    CurrentRun = Nothing
    ...

这要求用户选择他们想要使用的工作簿(按名称)。这似乎是个好主意,直​​到我今天把它放在 8 个不同的用户面前。大多数人最终习惯了选择工作簿,但并非没有很多抱怨和抛出错误(处理得很好)。 2 个用户从未得到它,并且不断地不小心编辑了错误的工作簿,并在使用一个小时后抛出错误。

有没有更好的方法来处理这个问题?我正在考虑尝试制作两个版本:一个带有上述版本,一个用于需要较少选择的人。有没有办法通过将 VBA 代码放入工作簿本身来强制建立一种一对一的关系?

我什至试图处理这个问题或引用 ActiveWorkbook 以外的任何东西,我是否是一种基本的方式?

[注意:蓝色警告告诉我这是一个主观问题,我有点害怕。我不是故意的;也许我需要措辞方面的帮助?]

【问题讨论】:

  • 我有点困惑。如果 2 个用户没有从组合中选择相关文件,那么 CurrentBook = CurrentRun.Workbooks(CurrentIndex) 这一行是如何工作的?理想情况下CurrentIndex 不应该有任何价值......还是它是预先填充的?如果这是预先填充的,那么我可以看到您的问题的一种解决方案是将组合设置为空白,然后在用户没有选择相关工作簿的情况下捕获它?
  • @SiddharthRout 它不起作用,因为它为空。它引发了一个索引错误,该错误由消息框“您需要选择要使用的工作簿”处理。这两个用户从来没有习惯这一点,因此不断地抛出错误。他们还打开和关闭了许多工作簿,因此索引经常更改(因此需要频繁更新所选工作簿)。在我看到之前,我认为这是一个优雅的解决方案。

标签: vb.net vsto add-in excel


【解决方案1】:

如果您的插件不能与任何打开的工作簿“正常工作”,那么您可能不应该使用应用程序插件;相反,您应该使用Document Add-In

在这种情况下,如果用户打开了 3 个工作簿(每个工作簿都有加载项),他们将各自在自己的域中操作 - 就好像其他工作簿不存在一样。

如果这是您环境中的一个选项,我强烈推荐它作为最佳实践。

【讨论】:

  • 我考虑过这一点,现在仍然如此。目前,插件处理 6 个不同的主要模板和大约 40 个次要模板(并且可以检测它正在处理哪一个/无法识别的书籍)。问题在于编辑了意外的文件,并且似乎无法培训一些用户。也许我应该将它构建到每个主模板中。
  • 我认为你是对的,如果它不是为“所有”工作簿设计的(即使它是为“许多”工作簿设计的),那么它应该被放到文档级别自定义。从应用程序插件到文档自定义有什么好的资源吗?我发现很多其他方式。
  • 我从来没有做过。如果是我,我不会尝试修改您当前的项目,我会启动一个新的文档级插件项目并从旧项目手动复制代码。祝你好运。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-23
  • 1970-01-01
  • 1970-01-01
  • 2011-02-27
相关资源
最近更新 更多