martinposer Geschrieben 5. August 2011 Geschrieben 5. August 2011 Hallo, hab ein neues Problem. Mein Programm soll auf Word zugreifen um da ein Dokument zu öffnen und dieses dann zu bearbeiten. Bei Word 97 - 03 konnte man einfach das VBA Makro in die Prozedur einfügen Bsp: Dim Word As New Word.Document Word.Application.Documents.Add() With Word.ActiveWindow 'Makro Code End With Jetzt habe ich allerdings Word 2010 Professional und hier funktioniert dieser Zugriff nicht mehr richtig. Das Makro wird nicht mehr akzeptiert an solchen Stellen: .Selection.MoveUp Unit:=wdLine, Count:=1 Woran kann das liegen? Hat jemand von euch eine Erklärung wie man Word 2010 aus Visual Basic heraus fernsteuern kann? Oder wie ich wieder die Word Library 9.0 verwenden kann? Zitieren
SilentDemise Geschrieben 5. August 2011 Geschrieben 5. August 2011 Visual Studio Tools for Office. Zitieren
Gateway_man Geschrieben 5. August 2011 Geschrieben 5. August 2011 Also wenn du dich auch mit vb.net auskennst, dann setz einen Verweis auf die Interop Assemblies. Dann musst du dein vb macro nurnoch an vb.net und der interopklasse anpassen. lg Gateway Zitieren
streffin Geschrieben 5. August 2011 Geschrieben 5. August 2011 Mit den Interop Klassen isses aber immer bissl hässlich die Office Instanz hinterher sauber zu schließen . Ich würd dich an der Stelle Marshal.ReleaseComObject(objDeineInstanz), und danach den GC anwerfen, sehr ans Herz legen. Auf die quit close exit bla funktionen der Interop DLL kannst du dich (leider) nicht verlassen. Gruß Sven Zitieren
martinposer Geschrieben 9. August 2011 Autor Geschrieben 9. August 2011 Hallo, ich bin jetzt über Interop gegangen, allerdings würde mich das mit Marshal.Release... auch interessieren. Hab es nur leider nicht ganz verstanden. Zitieren
Gateway_man Geschrieben 9. August 2011 Geschrieben 9. August 2011 Hallo, ich bin jetzt über Interop gegangen, allerdings würde mich das mit Marshal.Release... auch interessieren. Hab es nur leider nicht ganz verstanden. Hi, Die Interop Klassen sind einfacher ausgedrückt mächtige Interfaces die es dir gestatten Word/Excel/Powerpoint etc. über eben diese Interfaces zu steuern. Du kannst "fast" alle funktionalitäten der entsprechenden Programme über die Interops nutzen (vorrausgesetzt das Programm ist auf dem Rechner installiert). Das mit dem Marshal.Release, welches oben genannt wurde, sollte eigentlich Ole Objekte aus dem Speicher entfernen beziehungsweise ein Free() für die entsprechende Variable ausführen. Das braucht man, da das schließen per QUIT() Funktion, welche in der Interop.Application Klasse definiert ist, nicht immer reibungslos vonstatten geht. Allerdings klappt das mit dem Release auch nicht immer. Ich habe mir daher zwei kleine Funktionen geschrieben die das schließen erzwingen (sollte es mal nicht über QUIT() funktionieren). Der Code ist allerdings C#. Du kannst es ja durch den Converter jagen. Nutzung: Wenn Word sich nicht sauber schließt und der Prozess immernoch offen ist, kannst du den Prozess eindeutig über das MainHandle Identifizieren und diesen schließen. public class Util { [DllImport("user32")] static extern int GetWindowThreadProcessId(IntPtr hWnd, out int processId); public static int GetProcessIDByHandle(IntPtr hWnd) { int pid = 0; GetWindowThreadProcessId(hWnd, out pid); return pid; } public static void ForceProcessExit(int processID) { foreach (System.Diagnostics.Process item in System.Diagnostics.Process.GetProcesses()) { if (item.Id == processID) { try { item.Kill(); if (!item.HasExited) item.WaitForExit(8000); break; } catch { break; } } } } } Ich habe jetzt leider kein Wordbeispiel zur hand. Aber in PowerPoint sieht das so aus: public void Beispiel(){ //Defintion einer neuen PowerPoint Instanz Microsoft.Office.Interop.PowerPoint.Application oApp = new Microsoft.Office.Interop.PowerPoint.Application(); //Nach der Instanzerstellung hole ich mir direkt die ProzessID int ipid = Util.GetProcessIDByHandle(new IntPtr(oApp.HWND)); //Diverse Arbeiten mit der Powerpoint Instanz //Schließen der Instanz oApp.Quit(); oApp = null; //Zuguter letzt wird versucht den Prozess sofern noch vorhanden, zu killen Util.ForceProcessExit(ipid); } Ansonsten hier für Word noch ein paar Beispiele: Link1 Link2 lg Gateway Zitieren
martinposer Geschrieben 9. August 2011 Autor Geschrieben 9. August 2011 Vielen Dank für die Hilfe :-) Die Links werde ich mir gleich mal anschauen :-) Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.