【发布时间】: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 它不起作用,因为它为空。它引发了一个索引错误,该错误由消息框“您需要选择要使用的工作簿”处理。这两个用户从来没有习惯这一点,因此不断地抛出错误。他们还打开和关闭了许多工作簿,因此索引经常更改(因此需要频繁更新所选工作簿)。在我看到之前,我认为这是一个优雅的解决方案。