где тусуются VBA-шники? где найти монстров VBA, чтобы я у них попросил решить 15-летнюю проблему мсворда?
Re: где тусуются VBA-шники? версия ворда=любая от 95 до 2007. (использую 2003) задача: написать макрос, который будет определять сквозную вложенную нумерацию заголовков и пунктов в стилях. 1.Заголовок первого уровня 1.1.Пункт одын-одын 1.2.Заголовок второго уровня 1.2.1.Пункт одын-два-одын макрос должен срабатывать как на созданных мной документах, так и на присланных мне. стиль должен определиться так, чтобы по нажатию enter после строки заголовка я переходил на стиль Normal. чтобы по нажатию enter после строки пункта я переходил на стиль нумерованного списка того же уровня. при этом действия promote-text и demote-text должны: для заголовков менять уровень заголовка Header 1 <-> Header 2 <-> Header 3 с нумерацией 1, 1.1, 1.1.1 для пунктов менять уровень списка с нумерацией 1, 1.1, 1.1.1 нумерация должна быть сквозная, так как в тексте абзац может быть на втором уровне (под номером 1.2) как заголовок второго уровня, так и пункт списка второго уровня (под номером 1.2). макрос не должен содержать конструкцию ListGalleries(wdOutlineNumberGallery).ListTemplates(N).ListLevels(8), так как N сильно меняется от всего - от другого документа, от компа, от инсталляции. иногда оно работает для N=1, иногда толко для N=3. либо содержать её очень грамотно, только после тщательно определения реального значения N для каждого конкретного документа. попытка накатить With ListGalleries(wdOutlineNumberGallery).ListTemplates(i).ListLevels(1) .NumberFormat = "%1." .TrailingCharacter = wdTrailingSpace .NumberStyle = wdListNumberStyleArabic .NumberPosition = CentimetersToPoints(0) .Alignment = wdListLevelAlignLeft .TextPosition = CentimetersToPoints(0) .TabPosition = wdUndefined .ResetOnHigher = 0 .StartAt = 1 With .Font .Bold = wdUndefined .Italic = False .StrikeThrough = False .Subscript = False .Superscript = False .Shadow = False .Outline = False .Emboss = False .Engrave = False .AllCaps = False .Hidden = False .Underline = False .Color = False .Size = False .Animation = False .DoubleStrikeThrough = False .Name = "" End With .LinkedStyle = "" End With (и так до 9 уровня) для всех N от 0 до 100 к должному результату это не приводит - либо заголовки имеют тонкие цифры, либо пункты имеют жирные цифры. либо кнопочка "нумерация" на тулбаре превращает любое форматирование абзаца в стиль "Заголовок 1". макрос не должен искажать шрифт: на моих документах стандартным является Verdana, на чужих часто Times New Roman. вот так вот.
Re: где тусуются VBA-шники? Так а чем неустраивает пример из хелпа? Code: Dim ltTemp As ListTemplate Dim intLoop As Integer Set ltTemp = _ ActiveDocument.ListTemplates.Add(OutlineNumbered:=True) Dim strNF As String strNF = "" For intLoop = 1 To 9 strNF = strNF & "%" & intLoop & "." With ltTemp.ListLevels(intLoop) .NumberStyle = wdListNumberStyleArabic .NumberPosition = InchesToPoints(0.25 * (intLoop - 1)) .TextPosition = InchesToPoints(0.25 * intLoop) .NumberFormat = strNF End With With ActiveDocument.Styles("Heading " & intLoop) .LinkToListTemplate ListTemplate:=ltTemp End With Next intLoop Или я неправильно понял задачу? %)
Re: где тусуются VBA-шники? Почему это плохо? В документе же количество стилей нумерации не ограничено?
Re: где тусуются VBA-шники? мням... хорошо. как нумерации присвоить идентификатор, такой, чтобы я его мог однозначно увидеть и применить к пунктам списка? то, что стиль нумерации привязывается к Heading # - это вроде бы видно.
Re: где тусуются VBA-шники? Создать ListTemplate, создать стиль с красивым именем, привязать одно к другому. Нет?
Re: где тусуются VBA-шники? Menu Format -> Bullets an Numbering... List Styles -> Add Сохраняется на машине, от документа не зависит.
Re: где тусуются VBA-шники? сделал. записался макрос With ListGalleries(wdOutlineNumberGallery).ListTemplates(5).ListLevels(1) .NumberFormat = "%1." .TrailingCharacter = wdTrailingSpace .NumberStyle = wdListNumberStyleArabic .NumberPosition = CentimetersToPoints(0) .Alignment = wdListLevelAlignLeft .TextPosition = CentimetersToPoints(0) .TabPosition = wdUndefined .ResetOnHigher = 0 .StartAt = 1 With .Font .Bold = wdUndefined .Italic = wdUndefined .StrikeThrough = wdUndefined .Subscript = wdUndefined .Superscript = wdUndefined .Shadow = wdUndefined .Outline = wdUndefined .Emboss = wdUndefined .Engrave = wdUndefined .AllCaps = wdUndefined .Hidden = wdUndefined .Underline = wdUndefined .Color = wdUndefined .Size = wdUndefined .Animation = wdUndefined .DoubleStrikeThrough = wdUndefined .Name = "" End With .LinkedStyle = "" End With With ListGalleries(wdOutlineNumberGallery).ListTemplates(5).ListLevels(2) .NumberFormat = "%1.%2." .TrailingCharacter = wdTrailingSpace .NumberStyle = wdListNumberStyleArabic .NumberPosition = CentimetersToPoints(0) .Alignment = wdListLevelAlignLeft .TextPosition = CentimetersToPoints(0) .TabPosition = wdUndefined .ResetOnHigher = 1 .StartAt = 1 With .Font .Bold = wdUndefined .Italic = wdUndefined .StrikeThrough = wdUndefined .Subscript = wdUndefined .Superscript = wdUndefined .Shadow = wdUndefined .Outline = wdUndefined .Emboss = wdUndefined .Engrave = wdUndefined .AllCaps = wdUndefined .Hidden = wdUndefined .Underline = wdUndefined .Color = wdUndefined .Size = wdUndefined .Animation = wdUndefined .DoubleStrikeThrough = wdUndefined .Name = "" End With .LinkedStyle = "" End With и так далее до 9 ActiveDocument.Styles("NestNum").LinkToListTemplate ListTemplate:=ltTemp Selection.Style = ActiveDocument.Styles("NestNum") то есть я руками создал стиль нумерации NestNum, но в макросе факт создания не отражён. далее: запуск макроса после рукопашного создания NestNum работает нормально, а на новом документе (там, где NestNum вручную не создавался) - макрос вышибает на строке, выделенной жирным с сообщением "The requested member of the collection does not exist" полный текст макроса приаттачен - скомбинированный текст бимбома и твоя рекомендация записать макрос с ручника.
Re: где тусуются VBA-шники? сохраняется в доке, не на машине. если ставить галочку "внести в шаблон", тогда теоретически упадёт в normal.dot. но постоянно добавлять в свой любимый normal.dot стили не комильфо - разбухнет.
Re: где тусуются VBA-шники? что любопытно - если считать только по заголовкам (откинуть проблемы со списком NesNum), то все заголовки создаются нормально, кроме первого: Heading 1 1.1. Heading 2 1.1.1. Heading 3 1.1.1.1 Heading 4 1.1.1.1.1. Heading 5 1.1.1.1.1.1. Heading 6 1.1.1.1.1.1.1. Heading 7 1.1.1.1.1.1.1.1. Heading 8 1.1.1.1.1.1.1.1.1. Heading 9 то есть Heading 1 не высвечивает нумерации в документе.
Re: где тусуются VBA-шники? У меня такое было, если на стиле уже стоит нумерация (при повторной установке она сбрасывается видимо) Полечилось, если сначала сбросить нумерацию: Code: With ActiveDocument.Styles("Heading " & intLoop) .LinkToListTemplate Nothing .LinkToListTemplate ListTemplate:=ltTemp End With
Re: где тусуются VBA-шники? Я имел ввиду один раз добавить в шаблон ручками, а потом из скрипта его использовать. Но можно, наверное, и без добавления в normal.dot: Code: Sub FixStyles() Dim ltTemp As ListTemplate Dim intLoop As Integer Set ltTemp = _ ActiveDocument.ListTemplates.Add(OutlineNumbered:=True) Dim strNF As String strNF = "" For intLoop = 1 To 9 strNF = strNF & "%" & intLoop & "-" With ltTemp.ListLevels(intLoop) .NumberStyle = wdListNumberStyleArabic .NumberPosition = InchesToPoints(0.25 * (intLoop - 1)) .TextPosition = InchesToPoints(0.25 * intLoop) .NumberFormat = strNF End With With ActiveDocument.Styles("Heading " & intLoop) .LinkToListTemplate Nothing .LinkToListTemplate ListTemplate:=ltTemp End With Next intLoop Set ltTemp2 = _ ActiveDocument.ListTemplates.Add(OutlineNumbered:=True) strNF = "" For intLoop = 1 To 9 strNF = strNF & "%" & intLoop & "+" With ltTemp2.ListLevels(intLoop) .NumberStyle = wdListNumberStyleArabic .NumberPosition = InchesToPoints(0.25 * (intLoop - 1)) .TextPosition = InchesToPoints(0.25 * intLoop) .NumberFormat = strNF End With Next intLoop For Each p In ActiveDocument.Content.ListParagraphs If InStr(p.Style, "Heading") <= 0 And (p.Range.ListFormat.ListType = wdListOutlineNumbering Or p.Range.ListFormat.ListType = wdListSimpleNumbering) Then p.Range.ListFormat.ApplyListTemplate ListTemplate:=ltTemp2 End If Next End Sub
Re: где тусуются VBA-шники? то, что ты обозначаешь как + и - должно быть единой нумерацией. получается ты создаёшь две, и они не зависят друг от друга.