Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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?

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

Hallo,

ich bin jetzt über Interop gegangen, allerdings würde mich das mit Marshal.Release... auch interessieren. Hab es nur leider nicht ganz verstanden.

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

Vielen Dank für die Hilfe :-) Die Links werde ich mir gleich mal anschauen :-)

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.