确定 Excel 是否处于编辑模式
一个用于确定 Excel 是否处于编辑模式的小代码示例。
简介与背景
编程 Excel 对象模型中最棘手的部分之一是确定是否处于“编辑模式”。编辑模式是指单元格正在接受输入的状态。用户可以通过单击单元格、单击公式栏或按 F2 键进入编辑模式。为什么这会成为问题?当您尝试在处于编辑模式时运行一段代码(例如,设置单元格的 Value2
属性)时,会抛出一个 Exception
异常。
解决方案代码
本质上,问题在于确定我们是否处于编辑模式。如果有一个事件可以指示应用程序处于编辑模式,那就太好了。这样,您就可以在事件发生时适当地禁用您的 UI。由于不存在这样的事件,您必须在向自动化对象发出调用之前检查 Excel 是否处于编辑模式。Application.Ready
属性(MSDN)应该可以帮助您确定 Excel 自动化对象是否已准备好执行操作,但使用 .NET 2.0 和 Office PIA 时,此属性似乎总是返回 true
,无论您是否处于编辑模式(至少,我从未见过不同的情况)。
通过查看 Excel 2003 中命令栏的禁用状态,Excel 可以知道您是否正在编辑单元格,但不会将此信息与对象模型共享。检查是否处于编辑模式的一种简单方法是检查命令栏上菜单项的启用状态。为了做到这一点,我们必须找到该控件并检查其启用状态。(是的,此解决方案甚至适用于 2007 版本 - 因为命令栏仍然存在,只是从 UI 中隐藏了。)但是,存在一个注意事项:如果用户已从命令栏中删除了“新建”菜单,那么您将找不到它。在这种情况下,您必须假定 Excel 不处于编辑模式 - 话虽如此,此解决方案在 99% 的情况下可能都适用。
“新建”命令位于“工作表菜单栏”上 - 我们可以调用 FindControl
来找到我们正在寻找的精确菜单项,在本例中为“新建”菜单项。我们希望递归地查找它,因此最后一个参数应为 true
。以下代码片段将允许您确定 Excel 是否处于编辑模式。它会抛出一个 Exception
异常,或者您可以选择返回一个布尔值。
object m = Type.Missing;
const int MENU_ITEM_TYPE = 1;
const int NEW_MENU = 18;
CommandBarControl oNewMenu =
Application.CommandBars["Worksheet Menu Bar"].FindControl(
MENU_ITEM_TYPE, //the type of item to look for
NEW_MENU, //the item to look for
m, //the tag property (in this case missing)
m, //the visible property (in this case missing)
true ); //we want to look for it recursively
//so the last argument should be true.
if ( oNewMenu != null )
{
if ( !oNewMenu.Enabled )
{
throw new Exception( "Excel is in Edit Mode" );
}
}
历史
- 原始文章 - 2007/8/29。