none
VBNet lesen und ändern von Word Customsproperties

    Allgemeine Diskussion

  • Hallo Leute,

    ich möchte aus einem VBNet-Programm die Word-Customsproperties ändern.

    Auf der MS-Website habe ich dazu folgenden Code gefunden:

        Dim myWord As New ClsWord
            Dim dDate As Date
            dDate = Now()
            myWord.wdSourceFile = ""
            myWord.Set_Word()
    
            'For Each prop In myWord.wdApp.ActiveDocument.CustomDocumentProperties
            For Each prop In myWord.wdDok.CustomDocumentProperties
                If prop.Name = "Briefdatum" Then
                    MsgBox(CDate(prop.value))
                    prop.delete()
                End If
    
            Next
    
            myWord.wdDok.CustomDocumentProperties.Add(Name:="Briefdatum", LinkToContent:=False, Value:=Format(dDate, "dd. MMMM yyyy"), Type:=Microsoft.Office.Core.MsoDocProperties.msoPropertyTypeString)

    Der funktioniert allerdings nur, wenn ich die Anweisung "Option Strict Off" verwende, da dann VBNet wohl den Rest übernimmt.

    Nun möchte ich aber als braver Programmierer gerne typensicher mit "Option Strict On" arbeiten und da hagelt es dann immer Fehlermeldungen (Fehler späte Bindung.) :-?.

    Hat einer eine Idee wo der Fehler liegt.

    Vielen Dank im Voraus.

    Gruß A. Martens

    P.S. Word und VBNet = wir werden einfach keine Freunde. ;-)

    Donnerstag, 23. Mai 2019 15:58

Alle Antworten

  • Hallo Ahmed,

    für Option Strict On (was natürlich zu empfehlen ist) musst Du alle Variablen, Eigenschaften, usw. mit einem entsprechenden Typ versehen.

    In deinem Fall also bspw.:

    For Each prop As DocumentProperty In myWord.wdDok.CustomDocumentProperties
        ...
    Next

    Siehe dazu bspw.: Document.CustomDocumentProperties-Eigenschaft (Word)

    Wenn Du den Datentyp nicht kennst und der auch nicht so einfach über die Doku zu ermitteln ist (was bei der Word Doku schon mal vorkommen kann) kannst Du kurzzeitig auf Option Strict Off stellen und dir dann im Debugger anschauen, welcher Datentyp dann in der Variablen vorhanden ist.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport


    Donnerstag, 23. Mai 2019 16:07
    Moderator
  • Hallo Stefan,

    glaubs mir, ich habe das alles schon ausprobiert.

    Deine Anweisung:

    führt leider zum folgenden Fehler: BC30002    Der Typ "DocumentProperty" ist nicht definiert.

    Verwende ich: Dim prop As Microsoft.Office.Core.DocumentProperties

    Kommt es zu nachfolgende Fehlermeldung.

    System.InvalidCastException ist aufgetreten.
      HResult=0x80004002
      Nachricht = Das COM-Objekt des Typs "System.__ComObject" kann nicht in den Schnittstellentyp "Microsoft.Office.Core.DocumentProperties" umgewandelt werden. Dieser Vorgang konnte nicht durchgeführt werden, da der QueryInterface-Aufruf an die COM-Komponente für die Schnittstelle mit der IID "{2DF8D04D-5BFA-101B-BDE5-00AA0044DE52}" aufgrund des folgenden Fehlers nicht durchgeführt werden konnte: Schnittstelle nicht unterstützt (Ausnahme von HRESULT: 0x80004002 (E_NOINTERFACE)).
      Quelle = <Die Ausnahmequelle kann nicht ausgewertet werden.>
      Stapelüberwachung:
       bei WindowsApp1.Form1.BtnWordFenster_Click(Object sender, EventArgs e) in d:\Users\Büro\Documents\Visual Studio 2017\Projects\Word_Automation\Word_Automation\Form1.vb: Zeile135
       bei System.Windows.Forms.Control.OnClick(EventArgs e)
       bei System.Windows.Forms.Button.OnClick(EventArgs e)
       bei System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
       bei System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
       bei System.Windows.Forms.Control.WndProc(Message& m)
       bei System.Windows.Forms.ButtonBase.WndProc(Message& m)
       bei System.Windows.Forms.Button.WndProc(Message& m)
       bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       bei System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
       bei System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
       bei System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
       bei System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
       bei System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
       bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
       bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
       bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
       bei WindowsApp1.My.MyApplication.Main(String[] Args) in : Zeile81


    Laut Objektkatalog sollte es eine "Microsoft.Office.Interop.Word._Document.CustomDocumentProperties As Object" geben. Auf die kann ich aber nun überhaupt nicht verweisen.

    Ferner sagt mir der Debug.Bericht handelt es sich bei der Variablen "prop" um "Parent = {Microsoft.Office.Interop.Word.DocumentClass}".

    Wenn ich diese aber verwenden möchte, dann sagt mir der Objektkatolog das es "Microsoft.Office.Interop.Word.DocumentClass.CustomDocumentProperties As Object" gibt. Sobald ich aber diese nehme (Dim prop As Microsoft.Office.Interop.Word.DocumentClass.CustomDocumentProperties) kommt die Fehlermeldung Fehler:
    BC30002    Der Typ "Microsoft.Office.Interop.Word.DocumentClass.CustomDocumentProperties" ist nicht definiert.

    Und das meine ich, dass ich mit Word + VBNet niemals so richtig zusammenkommen.

    Hast Du vielleicht noch eine Idee was ich vielleicht falsch mache?
    Fehlt noch irgendein Verweis?


    Ich bin hier echt ratlos.

    Gruß A. Martens

    Donnerstag, 23. Mai 2019 17:20
  • Also ich habe es jetzt so gemacht, dass ich mir ein Modul einrichte, dass ausschließlich mit "Option Strict Off" geschlüsselt ist. Damit übernimmt VBNet die richtige Typenconvertierung. Alle anderen Anweisungen werden regulär mit "Option Strict On" betrieben.

    Ich habe es eben ausgetestet. Es scheint zu funktionieren. In dem neuen Modul werden keine Fehler bei nicht genügenden Verweisen ausgeworfen, in den anderen Modulen schon.

    Manchmal muss man sich halt mit der Brechstange behelfen. :-)

    Aber dennoch würde es mich interessieren, warum es nicht klappt.

    Gruß Ahmed


    Freitag, 24. Mai 2019 14:43
  • Hallo Ahmed,

    Deine Anweisung:

    führt leider zum folgenden Fehler: BC30002    Der Typ "DocumentProperty" ist nicht definiert.

    Verwende ich: Dim prop As Microsoft.Office.Core.DocumentProperties

    Kommt es zu nachfolgende Fehlermeldung.

    Schau mal, ob das in Fettschrift Hervorgehobene ein Tippfehler ist. Die Schnittstelle heißt nämlich DocumentProperty: Dim prop As Microsoft.Office.Core.DocumentProperty . Alternativ kannst Du Imports Microsoft.Office.Core am Anfang des Moduls hinzufügen.

    Gruß,
    Dimitar

    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Mittwoch, 29. Mai 2019 07:48
    Moderator