Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Word
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.03.2009, 09:27   #11
АлёнаP
Пользователь
 
Регистрация: 17.12.2008
Сообщений: 56
По умолчанию

Спасибо за подсказку
Код:
Dim myRange As Range
Dim Sec As Section
Dim oTable As Table
Dim oCell As Cell
Dim a1 As String, a2 As String, a3 As String
a1 = ad.FormFields("Name").Result
a2 = ad.FormFields("Num").Result
a3 = ad.FormFields("date1").Result
ActiveDocument.PageSetup.OddAndEvenPagesHeaderFooter = True 'различать нечетные страницы
For Each Sec In ActiveDocument.Sections
    Set oTable = Sec.Footers(wdHeaderFooterPrimary).Range.Tables.Add _
        (Sec.Footers(wdHeaderFooterPrimary).Range, 4, 2, wdAutoFitWindow)
    
    Sec.Footers(wdHeaderFooterPrimary).Range.Font.Size = 10
    With oTable
        .Cell(4, 1).Merge MergeTo:=.Cell(4, 2)
        .Cell(1, 1).Range = ""
        .Cell(1, 2).Range = ""
        .Cell(2, 1).Range = namePoln
        .Cell(2, 2).Range = a1
        .Cell(3, 1).Range = ""
        .Cell(3, 2).Range = ""
        .Cell(4, 1).Range = a2 & " от " & a3
        .Cell(4, 1).VerticalAlignment = wdCellAlignVerticalCenter
        .Cell(4, 1).Range.ParagraphFormat.Alignment = wdAlignParagraphCenter
    End With
Next Sec
АлёнаP вне форума Ответить с цитированием
Старый 30.03.2009, 10:54   #12
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Интересная задачка, которая обнажает еще одну странность Word.
Итак, в чем была задача? Вставить таблицу в колонтитул нечетной страницы каждого раздела. В предыдущих постах я ошибочно говорил, что в колонтитул первой страницы. Каюсь.
Естественный ход мысли для выполнения этих действий Алёна продемонстрировала в своем коде. Давно я не видел такого грамотного кода. Честно. Порадовали старика.
На первый взгляд, код совершенно правильный. Но не работает, как я смог убедиться. Вопрос: почему? В первый раздел таблица вставляется чудесно. Но затем строчка вставки таблицы дает ошибку

Когда-то, в годы юности, при работе с разными разделами мне нужно было сделать разные колонтитулы в разных разделах. Стандартным средством Word мне это не удалось. Я выкрутился, создав для каждого раздела документ и связал их полями INCLUDETEXT. Решение не изящное, но прошло.
Здесь похожая ситуация. Дело в том, что по умолчанию все колонтитулы в документе связаны друг с другом. Т.е., изменение содержимого колонтитула в одном разделе ведет к тому же в другом. Это по умолчанию. Но есть кнопка: «Как в предыдущем разделе», которая позволяет задать разное содержимое для колонтитулов разных разделов. Я пытался ее использовать раньше, но не понял как она работает. Ваш пример, Алёна, открыл мне глаза.
Эту кнопка работает правильно тогда, когда колонтитул предыдущего раздела пустой. Иначе, она не активна или работает как-то непонятно. Итак, в вашем макросе, Алёна, цикл идет по всем элементам коллекции Sections через For Each, т.е. с начала и до конца. Но, мы не можем установить содержимое колонтитула следующего раздела отличным от колонтитула предыдущего, если он — колонтитул предыдущего раздела — не пустой. Поэтому нужно идти с конца в начало. Вот так:
Код:
  For i = ActiveDocument.Sections.Count To 1 Step -1
    Set Sec = ActiveDocument.Sections(i) 'Запоминаем раздел, чтобы не менять его в уже готовом коде.
    'Вот эта загадочная строка! Она разрывает связь между текущим разделом и предыдущим.
    Sec.Footers(wdHeaderFooterPrimary).LinkToPrevious = False
    Set oTable = Sec.Footers(wdHeaderFooterPrimary).Range.Tables.Add _
        (Sec.Footers(wdHeaderFooterPrimary).Range, 4, 2, wdAutoFitWindow)
    
    Sec.Footers(wdHeaderFooterPrimary).Range.Font.Size = 10
    With oTable
      .Cell(4, 1).Merge MergeTo:=.Cell(4, 2)
      .Cell(1, 1).Range = ""
      .Cell(1, 2).Range = ""
      .Cell(2, 1).Range = namePoln
      .Cell(2, 2).Range = a1
      .Cell(3, 1).Range = ""
      .Cell(3, 2).Range = ""
      .Cell(4, 1).Range = a2 & " от " & a3
      .Cell(4, 1).VerticalAlignment = wdCellAlignVerticalCenter
      .Cell(4, 1).Range.ParagraphFormat.Alignment = wdAlignParagraphCenter
    End With
  Next i
Только сдается мне, что вам, Алёна, все это ни к чему, т.к. вы в колонтитул каждого раздела вставляете одно и тоже. Вам не нужно обращаться к каждому разделу отдельно, чтобы установить его нечетный колонтитул. Просто установите его для всего документа, а во всех разделах он появится автоматически, потому как по умолчанию.
Лучше день потерять — потом за пять минут долететь!©

Последний раз редактировалось viter.alex; 30.03.2009 в 13:22.
viter.alex вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
куда закачиваются файлы WorkBooks.ADD ? salgir Microsoft Office Excel 8 08.10.2008 21:32
MS Word: Range kate4ka Общие вопросы Delphi 1 19.02.2008 06:14
Chart1.Foot.Text.Add('gsdhfjk'); Небесный Общие вопросы Delphi 7 17.02.2008 15:21
Query1.SQL.Add('.......'); <--- ПОМОГИТЕ !!! SALEM БД в Delphi 3 24.11.2006 11:29