Есть ли способ добавить закладку к строке в заголовке, используя VBA для Word?

#vba #ms-word

#vba #ms-word

Вопрос:

Я рассмотрел все ваши комментарии и изменил свой код, как показано ниже:

Подзаголовок footermacro()

 'Delete the existing Header and Footer

ActiveDocument.Sections(1).Footers(wdHeaderFooterPrimary).Range.Delete
ActiveDocument.Sections(1).Headers(wdHeaderFooterPrimary).Range.Delete


Dim headerRange As Range

Set headerRange = ActiveDocument.Sections(1).Headers(wdHeaderFooterPrimary).Range
With headerRange
        
    .ParagraphFormat.Alignment = wdAlignParagraphRight
    .Bookmarks.Add Range:=headerRange, Name:="DocID"
    .Bookmarks.Add Range:=headerRange, Name:="UnderScore1"
    .Bookmarks.Add Range:=headerRange, Name:="DocName"
    .Bookmarks.Add Range:=headerRange, Name:="UnderScore2"
    .Bookmarks.Add Range:=headerRange, Name:="DocVersion"
    .InsertAfter Text:=vbTab amp; vbTab amp; "Page "
    .Collapse wdCollapseEnd
    .Fields.Add Range:=headerRange, Type:=wdFieldEmpty, Text:= _
      "PAGE  * Arabic "
    .End = .Paragraphs(1).Range.End
    .Collapse wdCollapseEnd
    .InsertAfter Text:=" of "
    .Collapse wdCollapseEnd
    .Fields.Add Range:=headerRange, Type:=wdFieldEmpty, Text:= _
      "NUMPAGES"
      
End With

                                                                   

'Show the Form

VersionForm.Show
  

Форма:
Частный подраздел OKBtn_Click()

 Dim DocName, DocVersion, DocID, UnderScore1, UnderScore2 As Range

Set DocID = ActiveDocument.Bookmarks("DocID").Range
Set UnderScore1 = ActiveDocument.Bookmarks("UnderScore1").Range
Set DocName = ActiveDocument.Bookmarks("DocName").Range
Set UnderScore2 = ActiveDocument.Bookmarks("UnderScore2").Range
Set DocVersion = ActiveDocument.Bookmarks("DocVersion").Range
    
DocID.Text = Me.TextBox1.Value
UnderScore1.Text = "_"
DocName.Text = Me.TextBox2.Value
UnderScore2.Text = "_"
DocVersion.Text = Me.TextBox3.Value

Me.Repaint
VersionForm.Hide
  

End Sub

Пожалуйста, найдите скриншот ниже:

Screenshot

Я все еще получаю «DocVersion» в начале. Но мне это нужно в формате: «DocID»»Undercore1″DocName»Undercore2″DocVersion. Пожалуйста, помогите.

И большое спасибо за вашу помощь 🙂

Ответ №1:

Быстрое решение вашей проблемы — просто изменить порядок вашего кода.

 If ActiveWindow.View.SplitSpecial <> wdPaneNone Then
    ActiveWindow.Panes(2).Close
End If

If ActiveWindow.ActivePane.View.Type = wdNormalView Or ActiveWindow. _
    ActivePane.View.Type = wdOutlineView Then
    ActiveWindow.ActivePane.View.Type = wdPrintView
End If

ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageHeader
Selection.ParagraphFormat.Alignment = wdAlignParagraphRight

'Insert the Header | Top Left
With ActiveDocument.Bookmarks
    .add Range:=Selection.Range, name:="DocID"
    .DefaultSorting = wdSortByName
    .ShowHidden = False
End With

'Selection.HomeKey Unit:=wdLine
Selection.TypeText text:="_DocName_V."

With ActiveDocument.Bookmarks
    .add Range:=Selection.Range, name:="DocVersion"
    .DefaultSorting = wdSortByName
    .ShowHidden = False
End With
Selection.TypeText text:=vbTab amp; vbTab

Selection.TypeText text:="Page "

Selection.Fields.add Range:=Selection.Range, Type:=wdFieldEmpty, text:= _
"PAGE  * Arabic ", PreserveFormatting:=True

Selection.TypeText text:=" of "

Selection.Fields.add Range:=Selection.Range, Type:=wdFieldEmpty, text:= _
"NUMPAGES  ", PreserveFormatting:=True
  

Однако ваш код действительно нужно переписать, чтобы избежать использования Selection объекта. Например:

 Sub AddTextToHeaderRange()
  Dim headerRange As Range
  
  Set headerRange = ActiveDocument.Sections(1).Headers(wdHeaderFooterPrimary).Range
  With headerRange
    .ParagraphFormat.Alignment = wdAlignParagraphRight
    .Bookmarks.add Range:=headerRange, name:="DocID"
    .text = "_DocName_V."
    .Collapse wdCollapseEnd
    .Bookmarks.add Range:=headerRange, name:="DocVersion"
    .InsertAfter text:=vbTab amp; vbTab amp; "Page "
    .Collapse wdCollapseEnd
    .Fields.add Range:=headerRange, Type:=wdFieldEmpty, text:= _
      "PAGE  * Arabic "
    .End = .Paragraphs(1).Range.End
    .Collapse wdCollapseEnd
    .InsertAfter text:=" of "
    .Collapse wdCollapseEnd
    .Fields.add Range:=headerRange, Type:=wdFieldEmpty, text:= _
      "NUMPAGES"
  End With
    
End Sub
  

Редактировать в связи с пересмотренным вопросом:
Если вы собираетесь использовать код, который вы опубликовали в своем пересмотренном вопросе, вам нужна только 1 закладка, а не 5.

Затем вы должны использовать следующий код для заполнения текста:

 DocID.Text = Me.TextBox1.Value amp; "_" amp; Me.TextBox2.Value amp; "_" Me.TextBox3.Value
  

Комментарии:

1. Большое спасибо, Тимоти. Теперь я изменил свой код в соответствии с вашим предложением. Мне все еще нужна ваша помощь. Пожалуйста, взгляните на мой измененный вопрос

2. @VikramNGaniga — это то, что известно как смещение стоек ворот. Пожалуйста, не делайте этого снова. Изменения, которые вы внесли в свой вопрос, затрудняют понимание того, каким был исходный вопрос.

3. ура! Это сработало!!!! Спасибо @Timothy. Ну, поле комментария было недостаточно длинным, чтобы вместить измененный код. Поэтому мне пришлось изменить свой исходный пост. Но я понимаю ваше беспокойство. Я новичок в stackoverflow, и я буду помнить об этом в следующий раз 🙂 Еще раз спасибо 🙂

Ответ №2:

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

Есть ли причина, по которой вы используете фиксированный docID, а не поле FileName?

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

Вот моя информация о том, как это сделать:http://www.addbalance.com/usersguide/autotextautocorrect.htm#UsingVBABuildingBlock

«Запись макроса будет работать в ограниченной степени. Записанные макросы не будут работать в чужой системе, даже если у них одинаковые строительные блоки или даже если они являются разными пользователями на одном компьютере. Записанные макросы не будут работать, если шаблон содержит более одного строительного блока с одинаковым именем, даже если они разных типов. Обратите внимание, что файл, который поставляется с Word «Встроенные строительные блоки.dotx», содержит много строительных блоков с одинаковыми именами. Вы можете использовать органайзер строительных блоков и отсортировать по имени, чтобы увидеть, есть ли несколько строительных блоков с одинаковым именем и в одном шаблоне.

Из-за этих ограничений часто вам нужно будет фактически написать макрос.

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

Любой макрос, записанный или дополненный, должен храниться в том же шаблоне, который содержит строительный блок. Таким образом, если макрос доступен, доступен и строительный блок.

  • Обратите внимание, что оригинал длиннее, чем можно опубликовать здесь, и содержит скриншоты. Он также включает примеры макросов.

Комментарии:

1. Большое спасибо, Чарльз. Да, я не записываю макрос… Я пишу новый макрос в соответствии с вашим предложением. Мне все еще нужна ваша помощь. Пожалуйста, взгляните на мой измененный вопрос

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