2012-06-18 1 views
3

Tous les exemples qui automatisent Excel via PowerShell commencent par cette ligne:Comment se connecter à une instance existante d'Excel à partir de PowerShell?

PS> $Excel = New-Object -Com Excel.Application 

Cela semble être la manipulation d'une nouvelle instance d'Excel, par exemple l'exécution $Excel.Visiable = $true affichera une fenêtre Excel vide et vide, ne pas basculer vers le classeur existant.

S'il existe déjà une instance d'Excel en cours d'exécution, existe-t-il un moyen de s'y connecter?

+0

Avez-vous besoin de vous connecter à une instance spécifique d'Excel représentée par une fenêtre spécifique? Sinon, vous pouvez également accéder à une instance Excel en cours d'exécution comme ceci: http://support.microsoft.com/kb/316126. L'article de la base de connaissances utilise C# mais les appels (System.Runtime.InteropServices.Marshal.GetActiveObject ("Excel.Application"), par exemple) devraient être assez faciles à traduire. –

+0

Juste pour compléter la réponse de Ian: $ Excel = [Runtime.Interopservices.Marshal] :: GetActiveObject ('Excel.Application') récupérera l'instance existante d'Excel. –

+0

Merci. Cependant, je viens d'essayer cela et ensuite exécuter '$ Excel.Visiable = $ true' - il a encore ouvert une nouvelle fenêtre Excel. – Borek

Répondre

1

Oui, vous pouvez accéder à l'objet COM via HWND [Poignée de fenêtre] à l'aide this WIN32 API (AccessibleObjectFromWindow).

(Voir un poste SO exemple here d'utiliser cette api via C#)

.

Vous devrez peut-être écrire un assemblage en C# et/ou manipulate P/Invoke calls via Powershell.

Vous pouvez essayer & voir comment ça se passe.

10

Au lieu de l'habituel New-Object-ComObject Excel.Application nous ce

$excel = [Runtime.Interopservices.Marshal]::GetActiveObject('Excel.Application')

Rest reste le même.

Un inconvénient. Vous obtiendrez seulement les "instances" excelées par le même utilisateur qui initiera le ps1.

Questions connexes