2014-10-30 10 views
1

Я пытаюсь изменить свойства документа, прежде чем сохранять его, но ни одно из моих свойств ниже не добавляется.Изменение свойства пользовательского документа в Word

Как исправить эту проблему? Благодарю.

'** 
' Set the required properties for this document 
'* 
Function SetProperties(ByVal DocumentName As String, _ 
          ByRef tempDoc As Document) As Boolean 

    Call UpdateCustomDocumentProperty(tempDoc, "Title", DocumentName & ".pdf", 4) 
    Call UpdateCustomDocumentProperty(tempDoc, "Subject", "New Starter Guides", 4) 
    Call UpdateCustomDocumentProperty(tempDoc, "Keywords", "new starters, guide, help", 4) 

    SetProperties = True 

End Function 

'** 
' Update a single custom value 
'* 
Function UpdateCustomDocumentProperty(ByRef doc As Document, _ 
             ByVal propertyName As String, _ 
             ByVal propertyValue As Variant, _ 
             ByVal propertyType As Office.MsoDocProperties) 

    On Error Resume Next 
    doc.CustomDocumentProperties(propertyName).value = propertyValue 
    If Err.Number > 0 Then 
     doc.CustomDocumentProperties.Add _ 
      Name:=propertyName, _ 
      LinkToContent:=False, _ 
      Type:=propertyType, _ 
      value:=propertyValue 
    End If 

    UpdateCustomDocumentProperty = True 

End Function 
+0

Как вы это называете? Проделали ли вы обычную отладку (т. Е. Поместите приглашение MsgBox в процедуру, чтобы убедиться, что она называется как ожидалось)? –

+0

Да, процедура вызывается. Я не включил весь мой код, так как это действительно не актуально, но будьте уверены, что я проверил, что включил вышеперечисленное. Благодарю. –

+0

* Как вы называете эту процедуру? * (Вручную или управляемый событиями?) Я уверен, что остальное - или, по крайней мере, часть вашего другого кода - имеет значение; особенно если этот код отвечает за сохранение и/или закрытие рассматриваемого документа, было бы легко сделать ошибку и закрыть с помощью SaveChanges: = False и т. д. –

ответ

4

Я не вижу ничего очевидного, но мне не нравится ваш On Error Resume Next. Почти всегда лучше поймать эту ошибку, и вы можете сделать это с помощью функции, которая проверяет, существует ли свойство, а не пытаться назначить несуществующее свойство и обрабатывать err.Number.

Я также изменил обе свои функции так, чтобы они возвращали значение вызывающей процедуре и поэтому могут использоваться в булевых операторах для оценки того, были ли присвоены свойства без ошибок. Ваши предыдущие функции всегда возвращались True по какой-то причине ...

Это, похоже, работает на меня и сохраняется за пределами сохранения/закрытия документа.

Option Explicit 
Sub setProps() 
    'I use this to invoke the functions and save the document. 

    If Not SetProperties("Another!", ThisDocument) Then 
     MsgBox "Unable to set 1 or more of the Custom Document Properties.", vbInformation 
     GoTo EarlyExit 
    End If 

    'Only save if there was not an error setting these 
    ThisDocument.Save 


    Debug.Print ThisDocument.CustomDocumentProperties(1) 
    Debug.Print ThisDocument.CustomDocumentProperties(2) 
    Debug.Print ThisDocument.CustomDocumentProperties(3) 

EarlyExit: 

End Sub 


Function SetProperties(ByVal DocumentName As String, _ 
          ByRef tempDoc As Document) As Boolean 
'** 
' Set the required properties for this document 
'* 
    Dim ret As Boolean 

    If UpdateCustomDocumentProperty(tempDoc, "Title", DocumentName & ".pdf", 4) Then 
     If UpdateCustomDocumentProperty(tempDoc, "Subject", "New Starter Guides", 4) Then 
      If UpdateCustomDocumentProperty(tempDoc, "Keywords", "new starters, guide, help", 4) Then 
       ret = True 
      End If 
     Else 
      ret = False 
     End If 
    Else 
     ret = False 
    End If 

    SetProperties = ret 


End Function 


Function UpdateCustomDocumentProperty(ByRef doc As Document, _ 
             ByVal propertyName As String, _ 
             ByVal propertyValue As Variant, _ 
             ByVal propertyType As Office.MsoDocProperties) 
'** 
' Update a single custom value 
'* 
    Dim ret As Boolean 
    ret = False 

    If PropertyExists(doc, propertyName) Then 
     doc.CustomDocumentProperties(propertyName).Value = propertyValue 
    Else: 
     doc.CustomDocumentProperties.Add _ 
      name:=propertyName, _ 
      LinkToContent:=False, _ 
      Type:=propertyType, _ 
      Value:=propertyValue 
    End If 

    On Error Resume Next 
    ret = (doc.CustomDocumentProperties(propertyName).Value = propertyValue) 
    On Error GoTo 0 

    UpdateCustomDocumentProperty = ret 
End Function 

Function PropertyExists(doc As Document, name As String) 
'Checks whether a property exists by name 
Dim i, cdp 

For i = 1 To doc.CustomDocumentProperties.Count 
    If doc.CustomDocumentProperties(i).name = name Then 
     PropertyExists = True 
     Exit Function 
    End If 
Next 

End Function 
+0

Да, это сделал трюк. Пользовательские свойства теперь добавляются, спасибо за помощь. И на всякий случай, если вам интересно, они не будут «Title», «Subject» и «Keywords» (которые являются доступными по умолчанию свойствами), это было просто для целей, поскольку фактические, которые я буду использовать, являются частными (скучные корпоративные вещи !). Благодарю. –

+1

@DavidGard, если ваша цель подана, отметьте как ответ, чтобы закрыть ее. – ZAT

+0

Alredy сделано @ZAT, уже сделано ... –

Смежные вопросы