Тема: Поле SEQ
Подскажите как можно получить список идентификаторов, которые используются в полях SEQ документа. Поле может стоять в колонтитуле, документе или надписи.
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Подскажите как можно получить список идентификаторов, которые используются в полях SEQ документа. Поле может стоять в колонтитуле, документе или надписи.
Материал с сайта: внешняя ссылка
Сейчас, к сожалению, найти его в интернете не могу.
Коды полей: SEQ (последовательность)
Поле SEQ (последовательность) служит для последовательной нумерации глав, таблиц, рисунков и других элементов в документе. При добавлении, удалении или перемещении элемента и соответствующего ему поля SEQ можно обновить остальные поля SEQ в документе, чтобы отразить новую последовательность.
Поле LISTNUM также обеспечивает автоматическую нумерацию и может быть лучшим вариантом, если нужно создать сложный нумерованный список.
Самым простым способом вставки полей SEQ для нумерации таблиц, фигур и других элементов в документе является использование команды Название, которая вызывается кнопкой Вставить название в группеНазвания на вкладке Ссылки.ПРИМЕЧАНИЕ. Поле SEQ в колонтитулах, примечаниях или сноске не влияет на последовательность нумерации, полученной из полей SEQ в тексте документа.
Синтаксис
При просмотре кода поля SEQ в документе его синтаксис выглядит следующим образом:
{ SEQ Идентификатор [Закладка ] [Ключи ] }
ПРИМЕЧАНИЕ. Код поля определяет то, что будет отображаться в поле. Результаты поля — это то, что отображается в документе после оценки кода поля. Для переключения между кодом поля и его результатами нажмите сочетание клавиш ALT+F9.Инструкции
Идентификатор
Имя, присвоенное ряду нумеруемых элементов. Имя должно начинаться с буквы, а его длина не должна превышать 40 знаков (букв, цифр и знаков подчеркивания). Например, ряд таблиц может иметь имя "таблицы".Закладка
Закладка может указывать на элемент в любом месте документа. Например, чтобы создать перекрестную ссылку на рисунок, пометьте нумерацию поля SEQ для этого рисунка закладкой "Рис2", а затем вставьте перекрестную ссылку на нумерацию, используя поле { SEQ illust Рис2 }.Ключи
\c
Повторяет ближайший предыдущий номер последовательности. Это полезно для вставки номеров глав в верхние или нижние колонтитулы.\h
Скрывает результат поля. Используйте этот ключ для указания поля SEQ в перекрестной ссылке без вывода номера. Например, можно сослаться на пронумерованную главу, но не выводить ее номер. Ключ "\h" не скрывает результат поля, если также указан ключ формата (\*).\n
Вставляет следующий порядковый номер для указанных элементов. Этот ключ используется по умолчанию.\r n
Сбрасывает порядковый номер до указанного числа n. Например, поле { SEQ figure \r 3 } начинает нумерацию рисунка с номера 3.Примечание: Для установки последовательности, начинающейся с номера n нужно установить только первое поле с этим ключом. Остальные поля последовательности должны быть обычными: { SEQ figure }.
Другое возможное решение – настройка последовательности с помощью поля формулы:
{ = 14 + { Seq Unit } }
Сначала оформляем поле формулы
{ = 14 + 1 }
а затем вместо 1 внутри поля формулы можно вставить поле простой последовательности
{ Seq Unit }
(например, с помощью комбинации клавиш Ctrl-F9).\s
Сбрасывает порядковый номер до уровня заголовка, указанного после "s". Например, поле { SEQ figure \s 2 }начинает нумерацию со стиля заголовка 2.Примеры
Если для форматирования заголовков документа не используются стили, заголовки глав можно пронумеровать, вставив поле SEQ в начале каждой главы.
• Результатом текста и поля "Глава { SEQ chapter }" будет строка наподобие "Глава 3."
• Чтобы вывести номер главы в верхнем или нижнем колонтитуле, используйте ключ "\c".
• Результатом кода "Стр. { SEQ chapter \c } - { PAGE }" будет строка наподобие "Стр. 3 - 1".Еще один пример:
Код поля с форматом числа:
{SEQ Cheques \# "00000000" \* MERGEFORMAT}В формате вы указываете то количество нулей, сколько цифр в числе нужно.
Обязательно нужно регулярно обновлять поля:
Выделить все - F9.
Нашел вторичную ссылку в интернете на описание кодов полей SEQ:
внешняя ссылка
Большое спасибо за ответ!
Но меня интересует как через VBA можно получить список идентификаторов, которые стоят в полях SEQ. Например: есть {SEQ Идент1} и {SEQ Идент2}, нужно получить список Идент1, Идент2.
Но меня интересует как через VBA можно получить список идентификаторов, которые стоят в полях SEQ.
Для этого нужно программировать на VBA (простите за капитанский ответ). Готовое решение вам тут никто не даст, я уверен (если только кому-то вдруг эта задача не покажется интересной, конечно).
Могу намекнуть, как это сделать:
1) Включаете коды полей (ALT+F9)
2) Ищете (CTRL+H) с галочкой Подстановочные знаки текст вида "SEQ * \" (без кавычек, естественно). Примечание - Звездочка * это любая последовательность знаков.
3) Далее записываете найденный результат в строковую переменную (String), отрезаете ненужные части "SEQ " и " \", заносите в массив, если в массиве этого значения нет.
4) Поиск в колонтитулах и надписях это сложно. Могу дать только ссылку на английскую статью Using a macro to replace text where ever it appears in a document внешняя ссылка
2) Ищете (CTRL+H) с галочкой Подстановочные знаки текст вида "SEQ * \"
Исправление! Надо искать "SEQ * \\". То есть с двумя обратными чертами. При включенных подстановочных знаках обратная косая черта это же спецсимвол.
Еще добавка: лучше сначала провести поиск поля SEQ (без подстановочных знаков .MatchWildcards = False)
With Selection.Find
.text = "^d SEQ" ' ищем поле SEQ
.Replacement.text = ""
...
И только потом в найденном искать остальное.
Всем спасибо!
С перебором всех полей я, конечно, осилю задачку. Я думал, что есть возможность с помощью каких либо встроенных средств VBA получить этот список.
Я думал, что есть возможность с помощью каких либо встроенных средств VBA получить этот список.
Лучше перебрать все поля, идентифицировать поля SEQ и обработать их, напр., как в коде ниже. Подпрограммы GetHead и GetTail я использую для разбора строк - они очень полезны. GetHead возвращает кусок исходной строки до заданной подстроки, а GetTail - после заданной подстроки.
'''-----------------------------------------
Sub ListFields()
Dim afld As Field
Dim fcode As String
Dim fname As String
Dim frange As Range
Dim fcodeitems As Variant
Set frange = ActiveDocument.Range
For Each afld In frange.Fields
fcode = afld.Code
fname = UCase$(Trim(fcode)) & " "
fname = Trim$(GetHead(fname, " "))
If UCase$(fname) = "SEQ" Then
'Обработать поле SEQ
End If
Next
End Sub
Public Function GetHead(ByVal input_line As String, ByVal sep_line As String) As String
'get substring from the beginning of the input_line till
'the char, preceding the sep_line
'Dim input_line As String
'Dim sep_line As String
Dim i_sep As Integer
Dim output_line As String
i_sep = InStr(input_line, sep_line)
'MsgBox Str$(i_sep)
If i_sep > 0 Then
output_line = Mid$(input_line, 1, i_sep - 1)
Else
output_line = ""
End If
GetHead = output_line
End Function
Public Function GetTail(ByVal input_line As String, ByVal sep_line As String) As String
'get the input_line substring after the sep_line
'Dim input_line As String
'Dim sep_line As String
Dim i_sep As Integer
Dim output_line As String
i_sep = InStr(input_line, sep_line)
If i_sep > 0 Then
If i_sep = Len(input_line) - Len(sep_line) + 1 Then
output_line = ""
Else
output_line = Mid$(input_line, i_sep + Len(sep_line))
End If
Else
output_line = ""
End If
GetTail = output_line
End Function
If UCase$(fname) = "SEQ" Then
'Обработать поле SEQ
End If
Можно и так (используя константы VBA):
If afld.Type = wdFieldSequence Then
'Обработать поле SEQ
Endif
Можно и так (используя константы VBA):
If afld.Type = wdFieldSequence Then
'Обработать поле SEQ
Endif
Привожу для сведения константы VBA для типов полей Word и их значения:
(внешняя ссылка)
wdFieldEmpty = 0xffffffff,
wdFieldRef = 3,
wdFieldIndexEntry = 4,
wdFieldFootnoteRef = 5,
wdFieldSet = 6,
wdFieldIf = 7,
wdFieldIndex = 8,
wdFieldTOCEntry = 9,
wdFieldStyleRef = 10,
wdFieldRefDoc = 11,
wdFieldSequence = 12,
wdFieldTOC = 13,
wdFieldInfo = 14,
wdFieldTitle = 15,
wdFieldSubject = 16,
wdFieldAuthor = 17,
wdFieldKeyWord = 18,
wdFieldComments = 19,
wdFieldLastSavedBy = 20,
wdFieldCreateDate = 21,
wdFieldSaveDate = 22,
wdFieldPrintDate = 23,
wdFieldRevisionNum = 24,
wdFieldEditTime = 25,
wdFieldNumPages = 26,
wdFieldNumWords = 27,
wdFieldNumChars = 28,
wdFieldFileName = 29,
wdFieldTemplate = 30,
wdFieldDate = 31,
wdFieldTime = 32,
wdFieldPage = 33,
wdFieldExpression = 34,
wdFieldQuote = 35,
wdFieldInclude = 36,
wdFieldPageRef = 37,
wdFieldAsk = 38,
wdFieldFillIn = 39,
wdFieldData = 40,
wdFieldNext = 41,
wdFieldNextIf = 42,
wdFieldSkipIf = 43,
wdFieldMergeRec = 44,
wdFieldDDE = 45,
wdFieldDDEAuto = 46,
wdFieldGlossary = 47,
wdFieldPrint = 48,
wdFieldFormula = 49,
wdFieldGoToButton = 50,
wdFieldMacroButton = 51,
wdFieldAutoNumOutline = 52,
wdFieldAutoNumLegal = 53,
wdFieldAutoNum = 54,
wdFieldImport = 55,
wdFieldLink = 56,
wdFieldSymbol = 57,
wdFieldEmbed = 58,
wdFieldMergeField = 59,
wdFieldUserName = 60,
wdFieldUserInitials = 61,
wdFieldUserAddress = 62,
wdFieldBarCode = 63,
wdFieldDocVariable = 64,
wdFieldSection = 65,
wdFieldSectionPages = 66,
wdFieldIncludePicture = 67,
wdFieldIncludeText = 68,
wdFieldFileSize = 69,
wdFieldFormTextInput = 70,
wdFieldFormCheckBox = 71,
wdFieldNoteRef = 72,
wdFieldTOA = 73,
wdFieldTOAEntry = 74,
wdFieldMergeSeq = 75,
wdFieldPrivate = 77,
wdFieldDatabase = 78,
wdFieldAutoText = 79,
wdFieldCompare = 80,
wdFieldAddin = 81,
wdFieldSubscriber = 82,
wdFieldFormDropDown = 83,
wdFieldAdvance = 84,
wdFieldDocProperty = 85,
wdFieldOCX = 87,
wdFieldHyperlink = 88,
wdFieldAutoTextList = 89,
wdFieldListNum = 90,
wdFieldHTMLActiveX = 91,
wdFieldBidiOutline = 92,
wdFieldAddressBlock = 93,
wdFieldGreetingLine = 94,
wdFieldShape = 95
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться