c# - 查看 Excel 是否处于 .NET 中的单元格编辑模式的解决方法

标签 c# vb.net excel interop excel-interop

我有一个用 VB.NET 编写的应用程序,它通过互操作与 Excel 进行交互。 我最终遇到了单元格编辑模式的已知问题(有关一些背景信息,请参阅 MSDNstackoverflow)。

我一直在尝试将建议的代码转换为 VB.NET,但不断收到以下错误:

Reference required to assembly 'office, Version=11.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c' containing the type 'Microsoft.Office.Core.CommandBars'. Add one to your project. (BC30652) - E:\ ... .vb:3471

原始C#代码(来自之前提到的文章)如下

private bool IsEditMode()
{
   object m = Type.Missing;
   const int MENU_ITEM_TYPE = 1;
   const int NEW_MENU = 18;

   // Get the "New" menu item.
   CommandBarControl oNewMenu = Application.CommandBars["Worksheet Menu Bar"].FindControl(MENU_ITEM_TYPE, NEW_MENU, m, m, true );

  if ( oNewMenu != null )
  {
     // Check if "New" menu item is enabled or not.
     if ( !oNewMenu.Enabled )
     {
        return true;
     }
  }
  return false;
}

我转换后的VB.NET代码如下

Private Function isEditMode() As Boolean
    isEditMode = False
    Dim m As Object = Type.Missing
    Const  MENU_ITEM_TYPE As Integer = 1
    Const  NEW_MENU As Integer = 18

    Dim oNewMenu As Office.CommandBarControl
    ' oExcel is the Excel Application object 
    ' the error is related to the below line
    oNewMenu = oExcel.CommandBars("Worksheet Menu Bar").FindControl(MENU_ITEM_TYPE, NEW_MENU, m, m, True)
    If oNewMenu IsNot Nothing Then
        If Not oNewMenu.Enabled Then
            isEditMode = True
        End If
    End If
End Function

我已添加对 Microsoft Office 对象库的 (COM) 引用

Imports Office = Microsoft.Office.Core
Imports Microsoft.Office.Interop

我有点陷入困境。我已经尝试过间接引用 CommandBar 对象,并重新添加引用,但无法找出问题所在。有任何想法吗?

最佳答案

作为一种快速而肮脏的修复,我使用以下代码作为替代方案

Private Function isEditMode() As Boolean
    isEditMode = False
    Try
        oExcel.GoTo("###")
    Catch Ex As Exception
       ' Either returns "Reference is not valid." 
       ' or "Exception from HRESULT: 0x800A03EC"
       If ex.Message.StartsWith("Exception") then isEditMode  = True
    End Try     
End Function

当 Excel 处于单元格编辑模式时,.GoTo 函数(和相应的菜单项)不可用。 如果代码运行时用户正在单元格中工作,则为 .GoTo 函数指定一个虚拟目标不会执行任何操作,也不会产生任何影响。

额外的一点是不需要引用 Microsoft Office 对象 (Microsoft.Office.Core) 库。

关于c# - 查看 Excel 是否处于 .NET 中的单元格编辑模式的解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/464196/

相关文章:

c# - 使用多个数据库与使用单个数据库的优缺点

vb.net - IXmlSerializable 字典问题

mysql - 如何通过查看数据库中的角色列以经理或员工身份登录?

excel - 推荐的 VBA IDE

Ruby Axlsx 真正的列自动宽度?

c# - 使用 IoC 容器 (Ninject) 注册通用 ICacheManager

c# - ref 和 out 有什么区别? (C#)

c# - 如何在具有动画器的游戏对象之外添加动画事件接收器/监听器?

vb.net - 从 SSIS 上的脚本任务执行时,Oracle 过程不返回结果

vba - ADODB 记录集记录计数始终返回 -1