2010-12-14 3 views
0

Lorsqu'un élément est sélectionné dans Excel, la propriété Excel :: Application :: Selection contient l'objet sélectionné. Par exemple si je sélectionne une cellule, je peux facilement les jeter à Excel :: Plage en utilisant:Excel Interop - Obtention du type d'Excel :: Application :: Sélection

Excel.Range cells = Excel.Application.Selection as Excel.Range 

Où Excel = Microsoft.Office.Interop.Excel

Maintenant, quand une image est sélectionnée, je dois jeter à Excel :: Image, puis Excel :: Shape dans le cas de certaines formes, mais il semble qu'il y ait différentes interfaces pour chaque forme comme Oval, Rectangle etc. J'ai besoin de supprimer tout ce qui est sélectionné sur la feuille de calcul. Si sa cellule, le contenu sera effacé, une image, la forme ou OLEObject sera supprimé, mais le problème est que je ne veux pas vérifier chaque interface:

if (null != ThisApplication.Selection as Excel.Shape) 
    (ThisApplication.Selection as Excel.Shape).Delete(); 
else if (null != ThisApplication.Selection as Excel.Picture) 
    (ThisApplication.Selection as Excel.Picture).Delete(); 
else if (null != ThisApplication.Selection as Excel.OLEObject) 
    (ThisApplication.Selection as Excel.OLEObject).Delete(); 

Je souhaite s'il y a juste une interface de base à laquelle je peux lancer toutes les formes/images et appeler supprimer sur eux.

Est-il possible d'obtenir:

  1. Le type réel à l'intérieur d'application :: Sélection - il affiche un système :: COMObject mais pas d'info sur le type réel
  2. identifient une certaine manière que la sélection contient une image/forme etc et appelle la méthode "Supprimer" sur le type sous-jacent

Répondre

1

Voici comment j'ai résolu mon problème. La réponse est d'utiliser la liaison tardive dans VBA. Nous appelons une macro VBA depuis notre add-in C# en utilisant la méthode Application.Run (...). La macro VBA exécute simplement le code suivant:

Application.Selection.Delete 

et VBA appelle la méthode Delete sur n'importe quelle forme.

Questions connexes