2009-01-21 7 views
2

J'ai une application écrite en VB.NET qui interagit avec Excel via interop. J'ai finalement rencontré le problème connu du mode d'édition de cellule (voir MSDN et stackoverflow pour un peu d'arrière-plan).Solution de contournement pour voir si Excel est en mode d'édition de cellule dans .NET

J'ai essayé de convertir le code suggéré VB.NET mais continuer à obtenir l'erreur suivante:

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 

Le code d'origine C# (à partir des articles previosuly mentionnés) est la suivante

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; 
} 
Mon

converti le code VB.NET est comme suit

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 

J'ai ajouté un (COM) référe e à la bibliothèque d'objets Microsoft Office

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

Je suis un peu coincé. J'ai déjà essayé de référencer indirectement l'objet CommandBar, et de rajouter des réfrences mais je n'arrive pas à comprendre quel est le problème. des idées?

+0

devrait être importations Bureau = Microsoft.Office .Core Importations Microsoft.Office.Interop.Excel pas Imports Office = Microsoft.Office.Core Importations M icrosoft.Office.Interop –

Répondre

3

Comme une solution rapide et sale i utilisé le code suivant comme une alternative

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 

La fonction .GoTo (et l'élément de menu correspondant) n'est pas disponible lorsque Excel est en mode édition cellulaire. Donner à la fonction .GoTo une destination fictive ne fera rien et n'affectera rien si l'utilisateur travaille dans la cellule lorsque le code est exécuté.

Un ajout supplémentaire est qu'aucune référence à la bibliothèque Microsoft Office Object (Microsoft.Office.Core) n'est nécessaire.

+0

Ce qui précède a bien fonctionné pendant un certain temps maintenant sur plusieurs configurations différentes. – barry

1
Function ExcelIsBusy() 
ExcelIsBusy = Not Application.Ready 
Dim m 
m = Empty 
Const MENU_ITEM_TYPE = 1 
Const NEW_MENU = 18 

Dim oNewMenu 
Set oNewMenu = Application.CommandBars("Worksheet Menu Bar").FindControl(MENU_ITEM_TYPE, NEW_MENU, m, m, True) 
If Not (oNewMenu Is Nothing) Then 
    If Not oNewMenu.Enabled Then 
     ExcelIsBusy = True 
     'throw new Exception("Excel is in Edit Mode") 
    End If 
End If 

End Function 
1

Nous avions précédemment utilisé la méthode Application.CommandBars["Worksheet Menu Bar"] mais nous avons rencontré un défaut. Lorsque vous quittez Excel en mode édition, le mode édition est annulé, mais la fonction renvoie la valeur true car les éléments du menu ont été désactivés lors de l'arrêt.

Nous avons utilisé la solution suivante à la place:

public static bool ApplicationIsInEditMode(Application application) 
{ 
    try 
    { 
     application.ReferenceStyle = application.ReferenceStyle; 
    } 
    catch (COMException e) 
    { 
     return true; 
    } 
    return false; 
} 
0

code suivant détecter si Excel est en mode Edit et sortir hors de lui:

private void exitEditMode() 
{ 

    if (!isExcelInteractive()) 
    { 
     // get the current range 
     Excel.Range r = Globals.ThisAddIn.Application.ActiveCell; 
     // bring Excel to the foreground, with focus 
     // and issue keys to exit the cell 
     xlBringToFront(); 
     Globals.ThisAddIn.Application.ActiveWindow.Activate(); 
     SendKeys.Flush(); 
     SendKeys.SendWait("{ENTER}"); 
     // now make sure the original cell is 
     // selected… 
     r.Select(); 
    } 
} 

private bool isExcelInteractive() 
{ 
    try 
    { 
     // this line does nothing if Excel is not 
     // in edit mode. However, trying to set 
     // this property while Excel is in edit 
     // cell mdoe will cause an exception 
     Globals.ThisAddIn.Application.Interactive = Globals.ThisAddIn.Application.Interactive; 
     return true; // no exception, ecel is 
     // interactive 
    } 
    catch 
    { 
     return false; // in edit mode 
    } 
} 

private void xlBringToFront() 
{ 
    SetForegroundWindow(Globals.ThisAddIn.Application.Hwnd); 
} 

[DllImport("User32.dll")] 
public static extern Int32 SetForegroundWindow(int hWnd); 
Questions connexes