Document Properties

J

Jeff Jones

I'm wrestling with a need to populate document properties
programatically. For example, I'd like to place an organization name
in the Document Properties Author Field and a system name in the
Category Field via a macro to save time when doing this in many
documents. Has anyone done this in a macro?

Best Regards,
Jeff
 
P

Paul Lautman

I can't remember where on the web I found this and Google can't seem to find
it now, but here are routines to read/write builtin and customer properties:

Public Sub WriteProp(sPropName As String, sValue As String, _
Optional lType As Long = msoPropertyTypeString)

'In the above declaration, "Optional lType As Long = msoPropertyTypeString"
means
'that if the Document Property's Type is Text, we don't need to include the
lType argument
'when we call the procedure; but if it's any other Prpperty Type (e.g. date)
then we do

Dim bCustom As Boolean

On Error GoTo ErrHandlerWriteProp

'Try to write the value sValue to the custom documentproperties
'If the customdocumentproperty does not exists, an error will occur
'and the code in the errorhandler will run
ActiveDocument.BuiltInDocumentProperties(sPropName).Value = sValue
'Quit this routine
Exit Sub

Proceed:
'We know now that the property is not a builtin documentproperty,
'but a custom documentproperty, so bCustom = True
bCustom = True

Custom:
'Try to set the value for the customproperty sPropName to sValue
'An error will occur if the documentproperty doesn't exist yet
'and the code in the errorhandler will take over
ActiveDocument.CustomDocumentProperties(sPropName).Value = sValue
Exit Sub

AddProp:
'We came here from the errorhandler, so know we know that
'property sPropName is not a built-in property and that there's
'no custom property with this name
'Add it
On Error Resume Next
ActiveDocument.CustomDocumentProperties.Add Name:=sPropName, _
LinkToContent:=False, Type:=lType, Value:=sValue

If Err Then
'If we still get an error, the value isn't valid for the Property Type
'e,g an invalid date was used
Debug.Print "The Property " & Chr(34) & _
sPropName & Chr(34) & " couldn't be written, because " & _
Chr(34) & sValue & Chr(34) & _
" is not a valid value for the property type"
End If

Exit Sub

ErrHandlerWriteProp:
Select Case Err
Case Else
'Clear the error
Err.Clear
'bCustom is a boolean variable, if the code jumps to this
'errorhandler for the first time, the value for bCustom is False
If Not bCustom Then
'Continue with the code after the label Proceed
Resume Proceed
Else
'The errorhandler was executed before because the value for
'the variable bCustom is True, therefor we know that the
'customdocumentproperty did not exist yet, jump to AddProp,
'where the property will be made
Resume AddProp
End If
End Select

End Sub



Sub Test()
'Author is a built-in property
Call WriteProp(sPropName:="Author", sValue:="William Shakespeare")

'Date Updated is a custom document property
Call WriteProp(sPropName:="Date Updated", sValue:="11 Mar 2001", _
lType:=msoPropertyTypeDate)
End Sub




Function ReadProp(sPropName As String) As Variant

Dim bCustom As Boolean
Dim sValue As String

On Error GoTo ErrHandlerReadProp
'Try the built-in properties first
'An error will occur if the property doesn't exist
sValue = ActiveDocument.BuiltInDocumentProperties(sPropName).Value
ReadProp = sValue
Exit Function

ContinueCustom:
bCustom = True

Custom:
sValue = ActiveDocument.CustomDocumentProperties(sPropName).Value
ReadProp = sValue
Exit Function

ErrHandlerReadProp:
Err.Clear
'The boolean bCustom has the value False, if this is the first
'time that the errorhandler is runned
If Not bCustom Then
'Continue to see if the property is a custom documentproperty
Resume ContinueCustom
Else
'The property wasn't found, return an empty string
ReadProp = ""
Exit Function
End If

End Function



Sub Testit()

Dim PropVal As String

PropVal = ReadProp("Author")
Debug.Print PropVal

PropVal = ReadProp("Date Completed")
Debug.Print PropVal

End Sub
 
P

Peter Kester

Can you also tell how this is done in VisualC++?
I'm fighting with the same problem but then in C++.

Thanx in advance.

Peter
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top