2008-10-21 7 views
2

J'écris un Addin Excel en utilisant COM Interop de .net. J'ai une commande qui ouvre une boîte de dialogue, et à partir de la boîte de dialogue, je travaille un peu comme la collecte de données à partir de la plage utilisée de plusieurs feuilles. Le problème est que si une cellule est en mode d'édition, certains des appels que j'ai besoin de faire jetteront des exceptions. Je voudrais un moyen de déterminer d'avance qu'Excel est en mode d'édition, afin que je puisse avertir l'utilisateur de finir d'éditer la cellule en premier.Comment savoir si Excel Application est en mode d'édition de cellule?

Des idées?

Répondre

7

Il existe une propriété Application.Ready censée vous fournir cette information mais, en pratique, elle ne fonctionne pas de manière fiable. Voir here pour une hackaround.

Vous pouvez également consulter le paramètre Application.Interactive = false pendant que votre code .net fait son travail.

+0

Hobbo, c'était exactement ce dont j'avais besoin. Merci! –

+0

Confirmé sur VSTO 2012 avec Excel 2010 - cette solution de contournement a également fonctionné pour moi. Bummer J'ai dû utiliser cela comme un hack, mais cela fonctionne mieux que les exceptions apparaissant dans l'addin. Si quelqu'un sait si elles ont mis à jour ou ajouté quelque chose de nouveau, s'il vous plaît mettre à jour ce fil! J'espère que quelque chose a été mis à jour depuis que ce fil a été introduit. – TravisWhidden

3

Essayez cette fonction:

Function IsInEditMode(ByRef exapp As Excel.Application) As Boolean 
     If exapp.Interactive = False Then 
      Return False 
     Else 
      Try 
       exapp.Interactive = False 
       exapp.Interactive = True 

       Return False 
      Catch 
       Return True 
      End Try 
     End If 
    End Function 
0

Vous n'avez pas mentionné quelle langue que vous utilisez. SZL's function est écrit en VB. Depuis que j'utilise C#, j'ai dû le convertir. J'ai bien travaillé. Voici le code C# équivalent.

bool IsInEditMode(ref Microsoft.Office.Interop.Excel.Application exapp) 
    { 
     if (exapp.Interactive == false) 
     { 
      return false; 
     } 
     else 
     { 
      try 
      { 
       exapp.Interactive = false; 
       exapp.Interactive = true; 
       return false; 
      } 

      catch 
      { 
       return true; 
      } 
     } 

    } 
Questions connexes