我有一个用VB.NET编写的应用程序,它通过互操作与Excel交互。我最终遇到了Cell-edit模式的已知问题(参见MSDN和stackoverflow了解一些背景)。
我一直在尝试将建议的代码转换为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对象,并重新添加引用,但无法找出问题所在。有什么想法吗?
6条答案
按热度按时间tv6aics11#
作为一个快速和肮脏的修复,我使用以下代码作为替代
当Excel处于单元格编辑模式时,.后藤函数(和相应的菜单项)不可用。如果代码运行时用户正在单元格中工作,则为.后藤函数提供一个虚拟目标将不会执行任何操作,也不会影响任何内容。
额外的一点是不需要引用MicrosoftOfficeObject(Microsoft.Office.Core)库。
x9ybnkn62#
一个老问题,但不是一个老问题。上面的检测和退出的解决方案很好,但我发现了另一种解决方案,可以让Excel退出编辑模式,不需要使用API来查找窗口或使用Sendkeys单击单元格,我的解决方案使用事件。Excel甚至可以处于编辑模式并最小化,这个解决方案仍然有效。如果你正在阅读这篇文章,你可能不需要确切的代码,但如果你需要,请让我知道。首先使用类似于前面的解决方案的try catch检测Excel编辑模式,并在Excel处于编辑模式时设置Global标志True。然后告诉Excel关闭。即使在编辑模式下,此操作也可用。在Excel OnClosing事件中,检查是否设置了全局标志,如果设置了全局标志,则将On Closing事件“e.Cancel”设置为True,这将停止Excel关闭。将Global标志设置回False,当Excel返回时,它将退出编辑模式,并且写入编辑单元格的任何内容都将仍然存在。
yx2lnoni3#
u5i3ibmn4#
我们以前使用
Application.CommandBars["Worksheet Menu Bar"]
方法,但我们遇到了一个缺陷。在编辑模式下退出Excel时,编辑模式取消,但函数仍返回true,因为菜单项已作为关闭的一部分被禁用。我们使用以下解决方案:
qybjjes15#
下面的代码将检测excel是否处于编辑模式,并将退出该模式:
cnjp1d6j6#
VB.NET代码: