Automatisierung von Word aus dem VB-Code

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von sashu.

    Automatisierung von Word aus dem VB-Code

    Hallo,

    ich entwickle eine VB-Anwendung im Visual Studio 2019, die Word automatisieren soll. Ich habe dem Projekt als Verweis die Microsoft.Office.Interop.Word.dll zugefügt und kann sie kompilieren. Um zu überprüfen, wie die Anwendung läuft, debugge ich sie in VS:

    VB.NET-Quellcode

    1. Dim oWord As Microsoft.Office.Interop.Word.Application
    2. oWord = CreateObject("Word.Application")
    3. oWord.Visible = True


    Ich erwarte, dass ich Word zu sehen bekomme, aber es knallt und ich bekomme die Meldung

    Quellcode

    1. System.InvalidCastException: Das COM-Objekt des Typs "Microsoft.Office.Interop.Word.ApplicationClass" kann nicht in den Schnittstellentyp "Microsoft.Office.Interop.Word._Application" umgewandelt werden. Dieser Vorgang konnte nicht durchgeführt werden, da der QueryInterface-Aufruf an die COM-Komponente für die Schnittstelle mit der IID "{00020970-0000-0000-C000-000000000046}" aufgrund des folgenden Fehlers nicht durchgeführt werden konnte: Fehler beim Laden der Typbibliothek/DLL. (Ausnahme von HRESULT: 0x80029C4A (TYPE_E_CANTLOADLIBRARY))


    Ich habe mich im Netz umgeschaut und einige vermuten, dass es vielleicht mehrere Word-Installationen gab und es besteht eine Inkompatibilität zwischen denen, was zur Exception führen kann. Es wird daher geraten Windows-Registry zu ändern und doppelte Einträge in {00020970-0000-0000-C000-000000000046} zu löschen. Ich habe das ausprobiert und es führt zu keiner Änderung.

    Deshalb meine Fragen: kennt sich jemand damit aus oder hat vielleicht jemand ein Beispielprojekt in VB (VB# oder VC++), das eine gleiche Anwendung implementiert?

    Grüße, sashu

    CodeTags eingefügt und in richtiges Unterforum verschoben ~ EaranMaleasi

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „EaranMaleasi“ ()

    Willkommen im Forum.

    Probier mal, in den Projekteigenschaften bei Kompilieren die Ziel-CPU auf x86 oder alternativ AnyCPU und 32-Bit bevorzuogen umzustellen. Geht es dann?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Bei Option Strict: ON würdest du sehen, dass die Zeile

    VB.NET-Quellcode

    1. oWord = CreateObject("Word.Application")

    unterkringelt wäre.
    Also als erstes das Projekt auf Option Strict: ON stellen.
    Dann die Zeile abändern in

    VB.NET-Quellcode

    1. oWord = CType(CreateObject("Word.Application"), Microsoft.Office.Interop.Word.Application)


    Und willkommen im Forum :)
    Danke für Willkommensgrüße!

    Beides funktioniert nicht. Ich habe auf AnyCPU umgestellt und es knallt weiter.

    Die Typisierung

    VB.NET-Quellcode

    1. oWord = CType(CreateObject("Word.Application"), Microsoft.Office.Interop.Word.Application)


    gibt das gleiche Ergebnis: Eine Word-Instanz wird erzeugt und bei oWord.Visible = True knallt es wieder.
    Danke, Dksksm. Erwarteterweise läuft dieses Projekt IN MEINER Umgebung nicht :cursing: Es wird die gleiche Exception geworfen, wie davor. Was kann ich jetzt tun? Ich habe bereits sowohl VS und auch Office neu installiert und alles umsonst. Das Einzige, was ich noch machen kann, wäre Windows neu installieren, aber das ist WIRKLICH nicht wünschenswert.
    Vielleicht reicht es ja schon ein neues Benutzerkonto zu erstellen und es damit zu versuchen. Du weißt ja nicht, was genau am System "broken" ist.
    Wenn es dann immer noch nicht geht, installiere Windows neu. Aber vorher alles auf eine externe Festplatte sichern. Verlass dich nicht darauf, dass Windows nicht doch auch andere Partitionen, sogar auf einer anderen Platte, zerlegt. Ist mir jedenfalls schon passiert, aber ich war vorbereitet :) Achja: IMO ist windows nach einem bis 2 Jahren Schrott, hat sich selbst geschrottet, whatever. Ich installiere jedes Jahre alle Rechner meiner Familie neu. Das ist schon Routine und die Dinger flitzen dannach gefühlt auch schneller und eine ganze Weile auch stabiler.
    Danke, Dksksm. Die Lösung mit einem anderen Nutzer ist mir nicht eingefallen. Aber ich suche trotzdem nach einem anderen Rechner, wo ich sauber neu installiere. Muss auf dem Rechner MS Office installiert sein, oder es reicht, wenn ich einfach die Microsoft.Office.Interop.Word in der VS-Studio-Installation habe?
    MS Office muss installiert sein. Die über Nuget verteilte Variante macht dich aber unabhängig von der konkret installierten Word-Version. Voraussetzung ist also nur ein Word ab Version 2003.
    Du kannst auch die entsprechende Programmbibliothek deiner Office Version benutzen und einbinden. Dann läuft dein Programm aber wirklich nur auf Rechner mit genau dieser Version, die du eingebunden hast.

    Interop ist ein Komponentenobjektmodell und erlaubt dir den Zugriff auf Word (Fernsteuern, wie VBA nur eben aus DOT.NET heraus), es ersetzt Word nicht.
    Danke. Anbei ist das Archiv. Ich bekam noch einen Tipp, dass ich so einen Code benutzen soll (funktioniert leider auch nicht):

    VB.NET-Quellcode

    1. Imports Microsoft.Office.Interop
    2. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    3. Dim oWord As New Word.Application
    4. oWord.Visible = True
    5. End Sub


    Apropos, dein Tipp mit der Umgebung anderen Benutzers funktioniert nicht -- es gibt die gleiche Exception.
    Dateien

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „sashu“ ()

    Dein Projekt ist leicht "defekt". Es enthält die Solution (SLN-Datei) nicht, die Struktur ist alo über ein Verzeichnis zu klein, natürlich kann man es dennoch öffnen.
    Du hast Option Strict: OFF und nicht ON, was für die 2 Zeilen Code aber keine Rolle spielt.
    Dein Code ist identisch mit meinem, mit der winzigen Ausnahme, dass du zwar Word aufmachst aber dann kein leeres Dokument erzeugst.
    Weil du mir kein korrektes Projekt geschickt hast ist die Datei packages.config nicht vorhanden, die gilt als vermisst.
    Du hats da eine für mich "komische" Service Reference im Projekt, die was mit mit Office 365-Diensten zu tun hat aber anscheinend nichts macht.
    Dein Verweis auf Microdoft.Office.Interop.Word geschieht direkt über C:\Windows\assembly\GAC_MSIL\Microsoft.Office.Interop.Word\15.0.0.0__71e9bce111e9429c\Microsoft.Office.Interop.Word.dll, wovon ich abrate.
    Da ich exakt die selbe Version Word verwende und sie auch identisch installiert ist, funktioniert der Verweis hier bei mir. Aber nur deshalb! Ich würde es trotzdem wie ich schon schrieb diesen Verweis löschen und dafür das entsprechende NuGet-Packet verwenden.
    Dein Code läuft bei mir also, du hast also einen vermurksten Rechner / Registry.

    Um solche Projekte sowohl zum Hochladen hier aber auch nur zu sichern einfach handhaben zu können, empfehle ich dir den SolutionExplorer vom @ErfinderDesRades zu verwenden.

    Dksksm schrieb:

    Dein Projekt ist leicht "defekt"...
    Dein Verweis auf Microdoft.Office.Interop.Word geschieht direkt über C:\Windows\assembly\GAC_MSIL\Microsoft.Office.Interop.Word\15.0.0.0__71e9bce111e9429c\Microsoft.Office.Interop.Word.dll...
    Ich würde es trotzdem wie ich schon schrieb diesen Verweis löschen und dafür das entsprechende NuGet-Packet verwenden.
    Dein Code läuft bei mir also, du hast also einen vermurksten Rechner / Registry.
    ...

    Danke für deine Stellungnahme. Weil ich so verzweifelt war, habe ich direkte C:\Windows\assembly\GAC_MSIL\Microsoft.Office.Interop.Word\15.0.0.0__71e9bce111e9429c\Microsoft.Office.Interop.Word.dll benutzt, aber ansonsten habe auch das NuGet-Packet heruntergeladen.

    Ich suche schon einen guten Rechner. Wollte erstmal ausschließen, dass ich etwas falsch angegeben hätte.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „sashu“ ()

    Es war tatsächlich Windows. Jetzt habe ich VS auf einem neuen Rechner installiert und dein Programm läuft ohne die Exception. Allerdings gibt es eine andere, wenn die Zeile Dim oDoc As New Word.Document ausgeführt wird. Womit kann das zusammenhängen?
    System.Runtime.InteropServices.COMException: 'Creating an instance of the COM component with CLSID {00020906-0000-0000-C000-000000000046} from the IClassFactory failed due to the following error: 80010001 Call was rejected by callee. (Exception from HRESULT: 0x80010001 (RPC_E_CALL_REJECTED)).'

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „sashu“ ()

    Ich verstehe deine Aussage nicht einmal. In meinem und in deinem Programm gibt es diese Zeile....
    Meines läuft ohne Exception und bei deinem Code knallt es? Trotzdem und ehrlich, keine Ahnung woran das liegt.
    Tatsächlich habe ich solche Ausnahmen wie bei dir noch nie gesehen.

    Bei den zwei- bis vierzeiler Tests überhaupt von Programmen zu reden finde ich schon gewagt ;)