Comment définir correctement les propriétés du document en utilisant VBA?
Le problème
Je vais avoir quelques problèmes pour configurer les propriétés d'un document à l'aide de VBA dans Word 2010.
J'ai un document contenant plusieurs Heading 1
sections et j'ai utiliser une macro pour extraire une section sélectionnée (avec son contenu) et de le coller dans un nouveau document.
Cette partie fonctionne très bien, mais à la fin j'ai besoin de définir plusieurs propriétés du document, mais aucun d'entre eux sont en cours de jeu.
Je suis en train de régler à la fois intégrée et personnalisée des propriétés, mais pour le but de cette question que je voudrais définir titresujet et, catégorie.
J'ai créé une fonction pour définir les propriétés que je désir (comme ci-dessous), et VBA est en train de jeter aucune erreur (même quand j'enlève la gestion d'erreur dans la fonction).
Quelqu'un sait ce que je fais de mal?
La façon dont la fonction est de travailler
Voici un bref résumé de ce que la fonction doit faire, mais la fonction complète est ci-dessous devrait vous trouvez qu'il est plus facile de contrôler la -
- Vérifier pour voir si la propriété existe déjà
- Qu'il fait et c'est un
default
propriété- Définir la valeur par défaut de la propriété
- Définir la
PropertyTypeUsed
variabledefault
- qu'il fait et c'est un
custom
propriété- Définir la propriété personnalisée
- Définir la
PropertyTypeUsed
variablecustom
- Il n'existe pas à tous les
- Créer une nouvelle propriété personnalisée
- Définir la propriété personnalisée
- Définir la
PropertyTypeUsed
variablecustom
- Qu'il fait et c'est un
- Vérifier si une valeur a été créé avec succès
- Un
default
propriété doit avoir été mis en- La propriété a réglé avec succès?
- Un
custom
propriété doit avoir été mis en- La propriété a réglé avec succès?
- Un
- Retourner le résultat
La fonction, je crois, est à l'origine du problème
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
Complet du projet de code
Le code complet pour ce projet peut être trouvé dans les deux Pâte Bacs -
Je ne suis pas sûr si il est possible d'obtenir le code pour créer réellement de la forme (court de l'exporter, mais je n'ai pas où le mettre), mais en tout cas c'est très simple -
- La forme -
frmChooseDocument
- L'étiquette -
lblChooseDocument
(Qui Démarreur document aimeriez-vous exporter?) - La zone de liste déroulante -
comChooseDocument
- Le bouton annuler -
btnCancel
- Le bouton OK -
btnOK
(Initialement désactivé)
En réalité, je suis en utilisant le document que les maisons de ce code comme un 'maître' de la nouvelle démarre, contenant des instructions détaillées sur la façon d'utiliser variouse applications.
Le code lui-même semble pour Heading 1
texte mis en forme dans le document, et les ajoute à la zone de liste déroulante dans le formulaire permettant à l'utilisateur de sélectionner une section à l'exportation. Un nouveau document est créé et enregistré en tant que fichier PDF.
Mise à jour
Comme suggéré dans les commentaires, j'ai vérifié que le type de la valeur définie correspond à la valeur passée à la fonction et il n'.
Dans le cas de tous les 3 propriétés décrites ci-dessus, à la fois de la valeur que je suis de passage et de la propriété tel qu'il est stocké sur le document sont de type string
.
J'ai ajouté un couple de lignes de sortie, le type et la valeur où je suis en train de le résultat et tout a l'air bien, mais évidemment, il ne l'est pas!
Debug.Print "My value: (" & TypeName(propertyValue) & ")" & propertyValue
Debug.Print "Stored property: (" & TypeName(doc.BuiltInDocumentProperties(propertyName).value) & ")" & doc.BuiltInDocumentProperties(propertyName).value
Est ici la sortie -
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
source d'informationauteur David Gard
Vous devez vous connecter pour publier un commentaire.
Permanent des propriétés de l'objet ne peut pas être définie par des fonctions. En d'autres termes, VBA ne permet pas de fonctions pour avoir des effets secondaires qui persistent après la fonction est terminée en cours d'exécution.
Ré-écrire la fonction comme un Sous et cela devrait fonctionner.
J'ai réussi à régler mon document word titre en enregistrant le document après la modification de la propriété. J'ai mis le "Sauvé" valeur false à la propriété pour s'assurer que Word enregistre le changement d'état.
Fenêtre Exécution: