где тусуются VBA-шники?

Discussion in 'Hardware and Software' started by -exec-, Nov 16, 2010.

  1. -exec-

    -exec- FH Consultant

    Joined:
    Jan 29, 2000
    Messages:
    24,690
    Location:
    xUSSR
    где тусуются VBA-шники?

    где найти монстров VBA, чтобы я у них попросил решить 15-летнюю проблему мсворда?
     
  2. bimbom

    bimbom FH Beta Tester

    Joined:
    Jan 19, 2006
    Messages:
    7,432
    Location:
    Moscow, Russia
    Re: где тусуются VBA-шники?

    а что хочешь-то? и версию ворда озвучь
     
  3. breedr

    breedr FH Developer

    Joined:
    Jan 27, 2000
    Messages:
    970
    Re: где тусуются VBA-шники?

    Билли, сдаётся мне, твой друг хочет обидеть нас… (C)
     
  4. -exec-

    -exec- FH Consultant

    Joined:
    Jan 29, 2000
    Messages:
    24,690
    Location:
    xUSSR
    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.

    вот так вот.
     
  5. breedr

    breedr FH Developer

    Joined:
    Jan 27, 2000
    Messages:
    970
    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
    
    Или я неправильно понял задачу? %)
     
  6. -exec-

    -exec- FH Consultant

    Joined:
    Jan 29, 2000
    Messages:
    24,690
    Location:
    xUSSR
    Re: где тусуются VBA-шники?

    тем, что запустив его N раз я добавлю N стилей нумерации?
     
  7. breedr

    breedr FH Developer

    Joined:
    Jan 27, 2000
    Messages:
    970
    Re: где тусуются VBA-шники?

    Почему это плохо? В документе же количество стилей нумерации не ограничено?
     
  8. -exec-

    -exec- FH Consultant

    Joined:
    Jan 29, 2000
    Messages:
    24,690
    Location:
    xUSSR
    Re: где тусуются VBA-шники?

    мням... хорошо. как нумерации присвоить идентификатор, такой, чтобы я его мог однозначно увидеть и применить к пунктам списка?

    то, что стиль нумерации привязывается к Heading # - это вроде бы видно.
     
  9. breedr

    breedr FH Developer

    Joined:
    Jan 27, 2000
    Messages:
    970
    Re: где тусуются VBA-шники?

    Создать ListTemplate, создать стиль с красивым именем, привязать одно к другому. Нет?
     
  10. -exec-

    -exec- FH Consultant

    Joined:
    Jan 29, 2000
    Messages:
    24,690
    Location:
    xUSSR
    Re: где тусуются VBA-шники?

    извини за тупость. как?
     
  11. breedr

    breedr FH Developer

    Joined:
    Jan 27, 2000
    Messages:
    970
    Re: где тусуются VBA-шники?

    Menu Format -> Bullets an Numbering...
    List Styles -> Add
    Сохраняется на машине, от документа не зависит.
     
  12. -exec-

    -exec- FH Consultant

    Joined:
    Jan 29, 2000
    Messages:
    24,690
    Location:
    xUSSR
    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"

    полный текст макроса приаттачен - скомбинированный текст бимбома и твоя рекомендация записать макрос с ручника.
     

    Attached Files:

    Last edited: Nov 18, 2010
  13. -exec-

    -exec- FH Consultant

    Joined:
    Jan 29, 2000
    Messages:
    24,690
    Location:
    xUSSR
    Re: где тусуются VBA-шники?

    сохраняется в доке, не на машине.
    если ставить галочку "внести в шаблон", тогда теоретически упадёт в normal.dot. но постоянно добавлять в свой любимый normal.dot стили не комильфо - разбухнет.
     
  14. -exec-

    -exec- FH Consultant

    Joined:
    Jan 29, 2000
    Messages:
    24,690
    Location:
    xUSSR
    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 не высвечивает нумерации в документе.
     
  15. -exec-

    -exec- FH Consultant

    Joined:
    Jan 29, 2000
    Messages:
    24,690
    Location:
    xUSSR
    Re: где тусуются VBA-шники?

    нет идей? :shuffle:
     
  16. -exec-

    -exec- FH Consultant

    Joined:
    Jan 29, 2000
    Messages:
    24,690
    Location:
    xUSSR
    Re: где тусуются VBA-шники?

    Игорь, Дмитрий, люди, ау? :)
     
  17. breedr

    breedr FH Developer

    Joined:
    Jan 27, 2000
    Messages:
    970
    Re: где тусуются VBA-шники?

    У меня такое было, если на стиле уже стоит нумерация (при повторной установке она сбрасывается видимо)
    Полечилось, если сначала сбросить нумерацию:
    Code:
        With ActiveDocument.Styles("Heading " & intLoop)
          .LinkToListTemplate Nothing
          .LinkToListTemplate ListTemplate:=ltTemp
        End With
    
     
  18. breedr

    breedr FH Developer

    Joined:
    Jan 27, 2000
    Messages:
    970
    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
    
     
  19. -exec-

    -exec- FH Consultant

    Joined:
    Jan 29, 2000
    Messages:
    24,690
    Location:
    xUSSR
    Re: где тусуются VBA-шники?

    то, что ты обозначаешь как + и - должно быть единой нумерацией.
    получается ты создаёшь две, и они не зависят друг от друга.
     
  20. breedr

    breedr FH Developer

    Joined:
    Jan 27, 2000
    Messages:
    970
    Re: где тусуются VBA-шники?

    Я не понял, у тебя весь документ чтоли из одних пунктов состоит?