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 -
- prüfen sehen bereits, wenn die Eigenschaft
- existiert es tut und es ist ein
default
Eigenschaft- Stellen Sie die Standardeigenschaft
- Stellen Sie die
PropertyTypeUsed
Variabledefault
- es nicht und es ist ein
custom
Eigenschaft- die benutzerdefinierte Eigenschaft Set
- Stellen Sie die
PropertyTypeUsed
Variablecustom
- Es existiert überhaupt nicht
- Erstellen Sie eine neue benutzerdefinierte Eigenschaft
- die benutzerdefinierte Eigenschaft
- die
PropertyTypeUsed
Variablecustom
- existiert es tut und es ist ein
- 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?
- A
- 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 -
- Die Form -
frmChooseDocument
- Das Label -
lblChooseDocument
(Welche neuen Starter-Dokument möchten Sie exportieren möchten?) - der Combobox -
comChooseDocument
- Die Abbruchtaste -
btnCancel
- 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
Man wünsche ich alles so aussah Fragen wie diese. – RubberDuck
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. –
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. –