Zum Inhalt springen

Visual Basic Word fernsteuern


martinposer

Empfohlene Beiträge

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...