#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
Пожалуйста, найдите скриншот ниже:
Я все еще получаю «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 для этого, а не автотекст или строительный блок заголовка. Вы используете закладки, а не просто вставляете текст, потому что хотите обновить их в какой-то момент. В противном случае, вместо добавления закладок, почему бы не вставить свой текст. Стандартное форматирование стилей верхнего и нижнего колонтитулов содержит центральную вкладку и настройку правой вкладки. Вы можете использовать их для позиционирования текста. Позволяет ли подчеркивание вашей пользовательской формы изменять разделитель между частями? В противном случае, если вы всегда используете подчеркивание, зачем создавать эту структуру.