2016-03-24 3 views
3

Ich versuche, F # zu verwenden, um einige Excel-Aufgaben zu automatisieren. Ich habe tatsächlich zwei Probleme: 1. Wenn ich eine Arbeitsmappe mit einer Excel.Application-Instanz öffne, würde ich alle Add-Ins vermissen, die automatisch geladen worden wären, wenn ich gerade die Arbeitsmappe in Excel geöffnet hätte. Also versuche ich zuerst die Arbeitsmappe in Excel zu öffnen, mit allen Add-Ins geladen, und dann die Instanz an F # übergeben. Dann habe ich das zweite Problem: 2. Das Marshal.GetActiveObject ("Excel.Application") öffnet tatsächlich eine neue Instanz, anstatt die vorhandene Instanz zu erhalten. Der Code ist unten:F # Excel-Interop: Marshal.GetActiveObject ("Excel.Application") funktioniert nicht

#r "Microsoft.Office.Interop.Excel" 
#r "office" 

open Microsoft.Office.Interop 
open System 
open System.Runtime.InteropServices 

let app = Marshal.GetActiveObject("Excel.Application") 
let app1 = app :?> Excel.Application 

let wb = app1.ActiveWorkbook 

let visible = app1.Visible 

let n = app1.Workbooks.Count 

und der Ausgang ist:

val App: obj

val app1: Excel.Application

val wb: Excel.Workbook = null

Wert sichtbar: bool = falsch

val n: int = 0

Aber ich bin mir sehr sicher, ich habe eine Excel-Instanz ausgeführt und es ist sichtbar. Vielen Dank!

+1

Haben Sie gesehen [Excel-Interop Laden XLLs und DLLs] (http://StackOverflow.com/Questions/13567512/Excel-Interop-Loading-Xlls-and-Dlls) Ich habe kein Excel, so dass ich nicht testen kann es für F #. –

+0

@GuyCoder: Vielen Dank für den Hinweis auf diesen Beitrag! Es scheint in der Lage zu sein, mein Problem zu lösen, braucht aber etwas Zeit zu verdauen. Es macht mir eigentlich nichts aus, manuell zu arbeiten, also würde ich meinen zweiten Ansatz bevorzugen, wenn es funktionieren könnte. Es sieht einfach unvernünftig aus, warum es nicht funktioniert. – xiphoid

Antwort

1

Ich habe meinen Code doppelt überprüft, und dies ist der Weg, Excel aus F # Skript zu verwenden (Excel-DNA für andere Fälle verwenden). Sehr oft (insbesondere bei Verwendung von Add-Ins) wird Excel jedoch nicht ordnungsgemäß geschlossen, und einige tote Excel-Prozesse bleiben im Task-Manager hängen, bis sie manuell beendet werden. Wahrscheinlich erhalten Sie einen falschen Prozess, nicht den, in dem Sie Ihre Arbeitsmappe öffnen.

+0

Vielen Dank! Wenn nur ein Excel-Prozess läuft, funktioniert der Code! Das ist jetzt gut genug für mich. – xiphoid