Modelo do Word 2010 com campos atualizados automaticamente

2

Eu quero criar um modelo do Word 2010 para minha equipe, o que garante que cada página inclua um rodapé com as seguintes informações:

  • Quem salvou o arquivo pela última vez
  • Quando o arquivo foi salvo pela última vez
  • O caminho e o nome do arquivo em que o arquivo está armazenado

Então, criei um arquivo de modelo (dotx) com um rodapé que contém os seguintes códigos de campo:

  • {LASTSAVEDBY * Bonés * MERGEFORMAT}
  • {SAVEDATE \ @ "d MMM yyy" * MERGEFORMAT}
  • {FILENAME -p}

No entanto, quando eu salvar este modelo e criar um novo documento (depois salvá-lo), os campos não serão atualizados. LASTSAVEDBY aparece em branco, SAVEDATE mostra 0 XXX 0000 e FILENAME mostra o Documento1.

Eu também tentei salvar isso como um modelo de ponto, caso haja algumas macros ocultas, mas os resultados são os mesmos.

    
por dunxd 07.08.2012 / 13:57

1 resposta

5

Portanto, a leitura do artigo KnowledegeBase da Microsoft sobre isso fornece a resposta irritante de que isso ocorre por design, por isso é necessário escrever uma macro para fazer isso. Com muita facilidade, eles fornecem uma macro que atualiza os campos quando você abre o arquivo, em vez de salvá-lo. Isso realmente faz mais sentido para um número de campos, então, desde que você use LASTSAVEDBY e SAVEDATE, isso fará sentido.

Lembre-se de que você não verá as atualizações aplicadas até que você abra o documento novamente. Para rodapés isso é absolutamente bom.

E como esta é uma macro, você precisa salvar como dotm.

Para quem precisa atualizar os campos ao salvar, há uma discussão nos fóruns do VBA Express , ou você poderia simplesmente adaptar a macro do documento da Microsoft .

Atualizar O vbscript da Microsoft é bom, mas resulta em um documento que sempre acha que foi editado, por isso sempre pede para salvar ao fechar. A maioria dos usuários sempre clicará sobre isso, o que resultaria nos valores LASTSAVEDBY e SAVEDATE mostrando quando o documento foi lido pela última vez e por quem.

Por isso, adicionei uma linha para marcar imediatamente o documento como inalterado depois de atualizar os campos. Quaisquer outras edições no documento irão redefinir isso, dando o aviso de salvar ao fechar.

Este é o código da macro:

Sub AutoOpen()
'
' AutoOpen Macro
'
'
   Dim aStory As Range
   Dim aField As Field

   For Each aStory In ActiveDocument.StoryRanges

      For Each aField In aStory.Fields
         aField.Update
      Next aField

   Next aStory

 ' set document as unchanged (prevents save dialog popping up when closing)
 ' further edits will set this back to false and restore 
 ' the save dialog on close
 ActiveDocument.Saved = True
End Sub

Atualizar O código acima funciona bem, a menos que você salve isso no seu modelo Normal.dotm, caso em que ele é executado toda vez que você abrir qualquer documento. Se o documento for aberto no Modo de Exibição Protegido (ou seja, foi baixado da Internet ou veio como anexo de email), o ActiveDocument não estará disponível. A solução é verifique se o documento não está no Modo de Exibição Protegido antes de executar as funções dentro da macro. Aqui está o código de macro atualizado, incluindo a instrução If para verificar se o documento não está no Modo protegido:

Sub AutoOpen()
    '
    ' AutoOpen Macro
    '
    '
       Dim aStory As Range
       Dim aField As Field

    ' Check that document is not in Protected View before doing anything
    If Application.ActiveProtectedViewWindow Is Nothing Then

           For Each aStory In ActiveDocument.StoryRanges

              For Each aField In aStory.Fields
                 aField.Update
              Next aField

           Next aStory

         ' set document as unchanged (prevents save dialog popping up when
         'closing) - further changes will set this back
         ActiveDocument.Saved = True
    End If
End Sub
    
por 07.08.2012 / 14:37