Microsoft word - campo personalizado com dados específicos da seção

0

Estou usando o Word 2007 no Windows XP (não consigo alterar isso).

Estou criando um modelo de página e quero mostrar uma informação específica no cabeçalho de cada página específica da seção. Deve ser o mesmo em cada página pertencente a cada seção e usuário editável (com preferência um espaço reservado padrão).

Por exemplo,

Na seção 1 que abrange as páginas 1 a 5, o valor pode ser KSF 100 , na seção 2 que abrange as páginas de 6 a 9, o valor pode ser KSF 200 . Nas páginas 1-5 eu quero mostrar KSF 100 no cabeçalho e nas páginas 6-9 eu quero mostrar KSF 200 .

Como eu poderia implementar isso?

    
por George Reith 24.01.2014 / 17:37

2 respostas

2

Se você tiver cabeçalhos por seção (desvinculados), em um sentido, tudo o que você precisa é de uma área com um texto de espaço reservado que o usuário possa substituir. Tradicionalmente, uma maneira de fazer isso é usar um campo {MACROBUTTON} como um espaço reservado, como este

{ MACROBUTTON Nomacro The placeholder text }

(Onde Nomacro é um nome de macro inexistente, anf o {} é um par de chaves de código de campo especial que você pode inserir usando ctrl-F9 no Windows Word)

Quando o usuário digita nesse campo, o campo e seu texto de espaço reservado são removidos.

Isso funciona nos cabeçalhos, bem como no corpo do documento. A principal desvantagem é, suponho, que, se o usuário excluir o texto, o espaço reservado não reapareça. Mas suspeito que outras coisas simples que o usuário poderia fazer (como adicionar ou excluir quebras de seção) podem ser mais propensas a quebrar o documento, qualquer que seja o método usado.

Se você quiser um único cabeçalho (ou seja, todos os cabeçalhos estão vinculados ao cabeçalho da Seção 1), a maneira tradicional de obter texto por seção em um cabeçalho é usar um campo {STYLEREF} que faça referência a um parágrafo ou área de texto com um estilo específico, geralmente no início ou próximo do início de cada seção.

A maioria das outras coisas parece mais complexa e provavelmente menos robusta do que provavelmente vale a pena. Por exemplo, você poderia inserir o valor de uma variável de documento ou propriedade de documento personalizada para cada seção usando um campo aninhado, como

{ DOCVARIABLE "header{ SECTION }" }

mas não haveria edições in-situ e você teria que usar o VBA para fornecer um mecanismo para o usuário modificar as variáveis do documento. Usando as propriedades personalizadas do documento, você pode pré-preencher um determinado número e usar

{ DOCPROPERTY "header{ SECTION }" }

e diga ao usuário como usar o editor de propriedade existente, mas isso não é simples.

Por fim, se a contagem de seções for fixa e você puder usar cabeçalhos desvinculados, poderá usar controles de conteúdo vinculados a um armazenamento de dados XML personalizado. Eles têm espaços reservados apropriados e são editáveis no local, mas novamente há a questão de como você classifica um documento que teve seções adicionadas / removidas. Abaixo está um exemplo de código para fazer a configuração inicial de um documento em branco com um número especificado de seções e um controle de conteúdo em cada cabeçalho. Isso só funcionaria no Windows Word 2007 e posterior.

Sub makeMappedCCPerSection()
' Run this with a newly created document
' Set this to the number of sections you want
Const sectioncount As Integer = 5
Dim cc As Word.ContentControl
Dim cxp As Office.CustomXMLPart
Dim cxpXML As String
Dim i As Integer
' the number of sections in your document
'Dim sectioncount As Integer

cxpXML = ""
cxpXML = cxpXML & "<root xmlns:hcc='header content control'>" & vbCrLf
cxpXML = cxpXML & "<sections>" & vbCrLf
For i = 1 To sectioncount
  cxpXML = cxpXML & "<section/>" & vbCrLf
Next
cxpXML = cxpXML & "</sections>" & vbCrLf
cxpXML = cxpXML & "</root>" & vbCrLf

With ActiveDocument
  For i = .CustomXMLParts.Count To 1 Step -1
    With .CustomXMLParts(i)
      If Not .BuiltIn Then
        .Delete
      End If
    End With
  Next
  Set cxp = .CustomXMLParts.Add(cxpXML)
  For i = 1 To sectioncount - 1
    .Content.InsertBreak WdBreakType.wdSectionBreakNextPage
  Next
  For i = sectioncount To 1 Step -1
    .Sections(i).Headers(wdHeaderFooterPrimary).Range.Text = " "
    If i > 1 Then
      .Sections(i).Headers(wdHeaderFooterPrimary).LinkToPrevious = False
    End If
    Set cc = .Sections(i).Headers(wdHeaderFooterPrimary).Range.ContentControls.Add(wdContentControlText)
    cc.SetPlaceholderText Text:="Section " & CStr(i) & " placeholder"
    cc.XMLMapping.SetMapping "/root/sections/section[" & CStr(i) & "]", , cxp
    Set cxp = Nothing
    Set cc = Nothing
  Next
End With
End Sub
    
por 25.01.2014 / 10:15
0

Uma outra sugestão para complementar a resposta da bibadia. Se você estivesse em uma situação em que não quisesse que o texto de entrada fosse visível dentro do documento o tempo todo, você poderia inserir um controle de conteúdo em cada seção e tornar o controle oculto (você também poderia impor que o controle não pode ser excluído para integridade). Envolva todo o controle de conteúdo em um marcador e, em seu rodapé, adicione um campo REF que aponte para o marcador e escolha o texto que foi inserido pelo usuário.

Você pode instruir o usuário a ativar os símbolos não imprimíveis para ver o controle de conteúdo sempre que desejar atualizar o rodapé do cabeçalho e desativá-lo para ocultar a entrada. Observe que STYLEREF não selecionará texto oculto.

    
por 29.01.2014 / 03:04