Download het huidige werkmapobject in C #

Ik ben bezig met het schrijven van een toepassing in C#, die aangepaste documenteigenschappen in een Excel-spreadsheet creëert, ik heb een functie hiervoor die een werkmapobject in beslag neemt ...

Het daadwerkelijk verkrijgen van het huidige werkmapobject blijkt echter behoorlijk vervelend te zijn, ik gebruik ExcelDNA om functionaliteit toe te voegen, maar ik kan mijn functie een geldig COM-werkobject niet passeren.

6

4 antwoord

Als u het activeringsboek moet vinden met C# , als u Office-interoperabiliteit gebruikt, kunt u dit soort code proberen:

(Workbook)Globals.ThisAddIn.Application.ActiveWorkbook;

[ Bron ]

15
toegevoegd
de bron is niet langer beschikbaar. Ik kan dit niet laten werken. Kan iemand hier een goede bron voor posten? Zeer geïnteresseerd omdat Marshal ook voor mij een nieuw exemplaar van Excel maakt.
toegevoegd de auteur Ja Austin, de bron
Dit werkt elke keer, in tegenstelling tot Marshal.GetActiveObject ("Excel.Application"); die ooit nieuwe Excel-exemplaren zou activeren
toegevoegd de auteur Joan-Diego Rodriguez, de bron
@AdamNumberFive, ja dat doet het. U kunt bijna hetzelfde doen met het Excel-COM-object door de Excel-toepassingsinstantie te gebruiken die u hebt en naar de eigenschap ActiveWorkbook te kijken.
toegevoegd de auteur Michael Kingsmill, de bron

Dit is de manier waarop ik het momenteel doe, het lijkt echt goed te werken

 using Excel = Microsoft.Office.Interop.Excel;      

Dan krijg je een actieve werkmap

        //Gets Excel and gets Activeworkbook and worksheet
        Excel.Application oXL;
        Excel.Workbook oWB;
        Excel.Worksheet oSheet;
        oXL = (Excel.Application)Marshal.GetActiveObject("Excel.Application"); 
        oXL.Visible = true;
        oWB = (Excel.Workbook)oXL.ActiveWorkbook; 

        docProps = oWB.CustomDocumentProperties

Dan zou ik proberen wat je hebt en zien hoe het werkt

Ik hoop dat dit helpt

14
toegevoegd
Vanuit Excel-DNA wilt u ExcelDnaUtil.Application aanroepen om ervoor te zorgen dat u het Application-object krijgt voor het Excel-proces waarin u actief bent, in plaats van het laatst geactiveerde Excel-exemplaar dat Marshal.GetActiveObject zal retourneren.
toegevoegd de auteur Govert, de bron
Ja, geen probleem. Ik heb nogal wat gedaan met excel als je vragen hebt, laat het me weten. Ik hoop dat dit je helpt!!!!
toegevoegd de auteur Russell Saari, de bron
UITSTEKEND. U mijnheer bent mijn held, dit heeft een nogal irritant probleem opgelost dat ik had, ik heb een nieuw paar ogen nodig! Zeer gewaardeerd.
toegevoegd de auteur Adam H, de bron
@RussellSaari Bedankt voor het antwoord. Als er twee exemplaren van Excel zijn geopend, retourneert deze methode altijd de instantie die als eerste is geopend. d.w.z. de tweede werkmap zal nooit worden geretourneerd, zelfs als deze de actieve is. Hoe verkrijgt u de huidige werkmap, ongeacht met welk exemplaar het bestand wordt geopend?
toegevoegd de auteur regmi, de bron

Zoals @Govert hierboven uitlegde in zijn commentaar:

using Excel = Microsoft.Office.Interop.Excel;
using ExcelDna.Integration;

// Get the correct application instance
Excel.Application xlapp = (Excel.Application)ExcelDnaUtil.Application;

// Get active workbook
Excel.Workbook wbook = xlapp.ActiveWorkbook;
7
toegevoegd
Ik krijg NullReference voor xlapp. Is er iets veranderd? Moet dit nog steeds werken?
toegevoegd de auteur regmi, de bron

GetActiveObject() kijkt in de Running Object Table (ROT) en geeft u de laatste geopende Excel-instantie die mogelijk niet overeenkomt met het excellevenster van de top Z-bestelling.

Loop door de Z-volgorde en zoek de bijbehorende werkmap.

See this link: - https://social.msdn.microsoft.com/Forums/office/en-US/060000d8-a899-49bf-a965-0576dee958d4/how-to-get-active-application?forum=exceldev

1
toegevoegd