2015-01-16 7 views
10

Das Problem

Ich bin mit VBA in Word 2010.Wie legen Sie die Dokumenteigenschaften mit VBA richtig fest?

einige Probleme einstellen Dokument Eigenschaften habe ich ein Dokument mehrere Heading 1 Abschnitte enthält, und ich verwende ein Makro einen ausgewählten Abschnitt zu extrahieren (zusammen mit ihm Inhalt ist) und fügen Sie es in ein neues Dokument ein.

Dieser Teil funktioniert gut, aber am Ende muss ich mehrere Dokumenteigenschaften festlegen, aber keiner von ihnen wird eingestellt.

Ich versuche, beide zu setzen integrierte und benutzerdefinierte Eigenschaften, aber für die Zwecke dieser Frage würde ich Titel, Thema und Kategorie setzen wollen.

Ich habe eine Funktion erstellt, um die Eigenschaften einzustellen, die ich wünsche (wie unten), und VBA wirft keinen Fehler (auch wenn ich Fehlerbehandlung in der Funktion entferne).

Weiß jemand, was ich falsch mache?


Wie die Funktion

Hier arbeiten sollte, ist eine kurze Zusammenfassung dessen, was die Funktion tun sollte, aber die volle Funktion ist unten sollten Sie es leichter überprüfen finden, dass -

  1. prüfen sehen bereits, wenn die Eigenschaft
    • existiert es tut und es ist ein default Eigenschaft
      • Stellen Sie die Standardeigenschaft
      • Stellen Sie die PropertyTypeUsed Variable default
    • es nicht und es ist ein custom Eigenschaft
      • die benutzerdefinierte Eigenschaft Set
      • Stellen Sie die PropertyTypeUsed Variable custom
    • Es existiert überhaupt nicht
      • Erstellen Sie eine neue benutzerdefinierte Eigenschaft
      • die benutzerdefinierte Eigenschaft
      • die PropertyTypeUsed Variable custom
  2. prüfen, ob ein Wert
    • A default Eigenschaft gesetzt Set erfolgreich gesetzt wurde sollte eingestellt werden
      • war th Die Eigenschaft erfolgreich gesetzt?
    • A custom Eigenschaft sollte
      • Wurde die Eigenschaft erfolgreich gesetzt wurden?
  3. Rückkehr das Ergebnis

Die Funktion Ich glaube, das Problem verursacht

Function UpdateDocumentProperty(ByRef doc As Document, _ 
           ByVal propertyName As String, _ 
           ByVal propertyValue As Variant, _ 
           Optional ByVal propertyType As Office.MsoDocProperties = 4) 

    '** Set the result to 'False' by default '* 
    Dim result As Boolean 
    result = False 

    '** A property to hold whether or not the property used is default or custom *' 
    Dim propertyTypeUsed As String 

    '** Check to see if the document property already exists *' 
    If PropertyExists(doc, propertyName) Then       ' A default property exists, so use that 
     doc.BuiltInDocumentProperties(propertyName).value = propertyValue 
     propertyTypeUsed = "default" 
    ElseIf PropertyExists(doc, propertyName, "custom") Then    ' A custom property exists, so use that 
     doc.CustomDocumentProperties(propertyName).value = propertyValue 
     propertyTypeUsed = "custom" 
    Else                ' No property exists, so create a custom property 
     doc.CustomDocumentProperties.Add _ 
      name:=propertyName, _ 
      LinkToContent:=False, _ 
      Type:=propertyType, _ 
      value:=propertyValue 
     propertyTypeUsed = "custom" 
    End If 

    '** Check whether or not the value has actually been set *' 
    On Error Resume Next 
    If propertyTypeUsed = "default" Then 
     result = (doc.BuiltInDocumentProperties(propertyName).value = propertyValue) 
    ElseIf propertyTypeUsed = "custom" Then 
     result = (doc.CustomDocumentProperties(propertyName).value = propertyValue) 
    End If 
    On Error GoTo 0 

    UpdateDocumentProperty = result 

End Function 

Vollprojektcode

Der vollständige Code für dieses Projekt kann in zwei Pasten Bins gefunden werden -

Ich bin nicht sicher, ob es möglich ist, für den Code zu bekommen tatsächlich die Form zu schaffen (kurz, um es zu exportieren, aber ich habe keine, wo es zu setzen), aber auf jeden Fall ist es sehr einfach -

  1. Die Form - frmChooseDocument
  2. Das Label - lblChooseDocument (Welche neuen Starter-Dokument möchten Sie exportieren möchten?)
  3. der Combobox - comChooseDocument
  4. Die Abbruchtaste - btnCancel
  5. Die OK-Taste - btnOK (zunächst deaktiviert)

In Wirklichkeit verwende ich das Dokument, das diesen Code enthält, als ein "Master" -Dokument für neue Starts, das detaillierte Anweisungen zur Verwendung verschiedener Anwendungen enthält.

Der Code selbst sucht nach formatiertem Text im Format Heading 1 und fügt sie dem Kombinationsfeld im Formular hinzu, sodass der Benutzer einen zu exportierenden Abschnitt auswählen kann. Ein neues Dokument wird erstellt und als PDF gespeichert.


aktualisieren

Wie in den Kommentaren vorgeschlagen habe ich, dass die Art von Wert überprüft, dass auf die Funktion übergeben der Wert übereinstimmt gesetzt werden wird, und es tut.

Bei allen drei oben beschriebenen Eigenschaften ist der Wert, den ich übergebe, und die Eigenschaft, die für das Dokument gespeichert wird, vom Typ string.

Ich habe die Art und Wert, bei dem ich das Ergebnis bin Einrichtung und sieht alles gut, ein paar Zeilen zur Ausgabe hinzugefügt, aber offensichtlich ist es nicht!Hier

Debug.Print "My value:  (" & TypeName(propertyValue) & ")" & propertyValue 
Debug.Print "Stored property: (" & TypeName(doc.BuiltInDocumentProperties(propertyName).value) & ")" & doc.BuiltInDocumentProperties(propertyName).value 

ist der Ausgang -

My value:  (String)New Starter Guide - Novell 
Stored property: (String)New Starter Guide - Novell 
My value:  (String)New starter guide 
Stored property: (String)New starter guide 
My value:  (String)new starters, guide, help 
Stored property: (String)new starters, guide, help 
+8

Man wünsche ich alles so aussah Fragen wie diese. – RubberDuck

+0

Das Problem ist, dass es False zurückgibt, oder? Ich habe das gleiche Ergebnis, als ich versuchte, einen Boolean zu setzen. Es wurde True mit -1 verglichen und keine Übereinstimmung genannt. Anstatt es auf True zu setzen, setze ich es auf -1. Immer noch falsch. Jetzt wird -1 mit -1 verglichen. Überprüfen Sie den TypeName von propertyvalue und von doc.CustomeDocumentProperties (properyName) .value und überprüfen Sie, ob sie identisch sind. Mit Dingen wie Titel, Thema und Kategorie kann ich mir nicht vorstellen, dass sie anders wären, aber es ist ein Anfang. –

+0

Es wird in der Tat in jedem Fall falsch zurückgegeben, aber es wird auch nicht wirklich die Eigenschaft gesetzt (was getan wird, bevor überprüft wird, ob es erfolgreich war oder nicht). Ich schaue mir jetzt deine anderen Kommentare an ... Danke. –

Antwort

1

Permanent Objekteigenschaften können nicht durch Funktionen eingestellt werden. Mit anderen Worten, VBA lässt Funktionen keine Nebenwirkungen zu, die bestehen bleiben, nachdem die Funktion beendet ist.

Schreiben Sie die Funktion als ein Sub und es sollte funktionieren.

1

Ich habe es geschafft, meinen Word-Dokumenttitel festzulegen, indem ich das Dokument nach dem Ändern der Eigenschaft speichern. Ich stelle die Eigenschaft "Saved" zuerst auf false, um sicherzustellen, dass Word die Statusänderung registriert.

Function ChangeDocumentProperty(doc As Document, sProperty As String, sNewValue As String) 

    Debug.Print "Initial Property, Value: " & sProperty & ", " & doc.BuiltInDocumentProperties(sProperty) 

    doc.BuiltInDocumentProperties(sProperty) = sNewValue 

    doc.Saved = False 
    doc.Save 

    ChangeDocumentProperty = (doc.Saved = True And doc.BuiltInDocumentProperties(sProperty) = sNewValue) 

    Debug.Print "Final Property, Value: " & sProperty & ", " & doc.BuiltInDocumentProperties(sProperty) 

End Function 

Direkt-Fenster:

? ThisDocument.ChangeDocumentProperty(ThisDocument, "Title", "Report Definitions") 
Initial Property, Value: Title, Report Glossary 
Final Property, Value: Title, Report Definitions 
True 
+0

Entschuldigung, ich habe das obige erneut gelesen und fühle jetzt, dass ich den Punkt komplett verpasst habe. Ich dachte, dass die Dokumenteigenschaften nicht geändert wurden. Bitte ignoriere meinen Beitrag, wenn es irrelevant ist! – TehJake

Verwandte Themen