Новости:

Интересные и полезные статьи по работе с Excel и VBA
можно найти в разделе ХИТРОСТИ

Главное меню

WORD Удалить фигуру из верхнего колонтитула

Автор oleg4226, 12.09.2019, 09:05:48

« назад - далее »

oleg4226

Доброго дня всем !

задача получилась непростая
Нужно из верхнего колонтитула последней страницы
удалить фигуру

Макрорекодер выдал следущее:

'открываем колонтитулы
ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageHeader
'выделяем фигуру
Selection.HeaderFooter.Shapes("Group 851").Select
'вырезаем
Selection.Cut


но дело в том что имя фигур будет менятся на последнем листе - как то надо
добраться до последнего листа и удалить имеющуяся в врхнем колонтитуле фигуру

на просторах инета раскопал макрос
Добраться до последнего листа листа можно
но как удалить фигуру ?


Dim D As Word.Document
Dim R As Word.Range
Dim F As Word.HeaderFooter
Dim N As Long
   
   ' документ
   Set D = ActiveDocument ' заменить вашим
   ' всего страниц
   N = D.Range.Information(Type:=Word.wdActiveEndPageNumber)
   ' начало последней страницы
   Set R = D.GoTo(What:=Word.wdGoToPage, _
                  Which:=Word.wdGoToAbsolute, _
                  Count:=N)
   ' перебираем верхние колонтитулы
'    For Each F In D.Range.Sections.Last.Footers
   For Each F In D.Range.Sections.First.Footers
       F.LinkToPrevious = False ' отсоединяем
       F.Range.Delete ' очищаем - не сработало не удалило фигуру
'        F.Shapes.Cut ' очищаем - не сработало
   Next F

Дмитрий Щербаков(The_Prist)

А всего фигур сколько может быть в колонтитуле? Одна, две, десять? Пример приложить нет возможности?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

oleg4226

Страницы поделены на разделы
В верхнем колонтитуле каждой страницы одна сгруппированная фигура
Положение - перед текстом

И именно на последней странице надо удалить фигуру в верхнем колонтитуле

Сейчас попробую упрощенный пример сделать - файл большой просто со множеством страниц


Дмитрий Щербаков(The_Prist)

У Вас последний колонтитул отдельно от остальных, что ли? Нет же такого понятия - колонтитул для каждой отдельной страницы. У Вас руками получается удалить фигуру в колонтитуле только последней страницы так, чтобы на остальных эта фигура осталась?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

Дмитрий Щербаков(The_Prist)

#4
Ну в общем сами разберетесь что там у Вас как. Но. Ваши ошибки в коде:
1. Footers - это нижний колонтитул, а не верхний.
2. В колонтитулах как правило InlineShapes, к которому напрямую обратиться нельзя, значит надо использовать Selection
3. В итоге должно получиться что-то вроде:

'чтобы обращаться к Selection надо перейти в колонтитул
Application.Selection.WholeStory
Application.Browser.Next
D.Windows(1).ActivePane.View.SeekView = wdSeekCurrentPageHeader
For Each F In D.Range.Sections.First.Headers
       F.Range.Start = 1
       F.Range.End = F.Range.Characters.Count
       If Selection.InlineShapes.Count > 0 Then
           Selection.InlineShapes(Selection.InlineShapes.Count).Delete
       End If
   Next F
'возвращаем вид редактирования документа, а не колонтитула
D.Windows(1).ActivePane.View.SeekView = 0

Удаляет последнюю картинку или единственную.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

oleg4226

#5
файл долго правил - сорри

к сожалению ваш макрос почемуто не удаляет фигуру в верхнем колонтитуле на последнем листе :(

Дмитрий Щербаков(The_Prist)

Готовый код:
    Dim D As Word.Document
    Dim R As Word.Range
    Dim F As Word.HeaderFooter
    Dim N As Long
   
    ' документ
    Set D = ActiveDocument ' заменить вашим
    ' всего страниц
    N = D.Range.Information(Type:=Word.wdActiveEndPageNumber)
    D.Sections(N).Headers(1).Range.Select
    Set F = D.Sections(N).Headers(1)
    If F.Shapes.Count > 0 Then
        For N = F.Shapes.Count To 1 Step -1
            F.Shapes(N).Delete
        Next
    End If
    'возвращаем вид редактирования документа, а не колонтитула
    D.Windows(1).ActivePane.View.SeekView = 0

Но как писал ранее - нельзя изменить только ОДИН последний колонтитул - изменения будут для всех произведены.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

oleg4226

Почему нельзя - страницы же разделами разделены ?
ошибка у меня к сожалению вылезла на вашем последнем варианте

на строке
D.Sections(N).Headers(1).Range.Select

пишет
Run-time error 5941
Запрашиваемый номер семейства не существует

Дмитрий Щербаков(The_Prist)

#8
У меня на Вашем же примере все работает. Посмотрите чему равно D.Sections.Count и что в N попадает. Ну и убедитесь, что на момент запуска активен правильный документ - может в активном документе нет верхнего колонтитула.
Цитата: oleg4226 от 12.09.2019, 10:18:34Почему нельзя - страницы же разделами разделены ?
И что? Раздел и колонтитул - это разные вещи. Колонтитул создается для документа в целом, а не для каждого раздела в отдельности. Еще раз повторю вопрос: получилось у Вас вручную изменить колонтитул ТОЛЬКО НА ОДНОЙ странице так, чтобы колонтитулы на других страницах при этом не изменились?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

oleg4226

У меня верхние колонтитулы только для того чтобы вставлять фигуры - рамки чертежные
страницы поделены разделами - на каждой странице разная фигура в верхнем колонтитуле
если я удаляю фигуру на определенной странице в колонтитуле - это никак не влияет на другие колонтитулы
както так думаю


Дмитрий Щербаков(The_Prist)

#10
Ну я не знаю - в приложенном примере это точно не работает, колонтитул удаляется везде. Вероятно, пример неудачный. Раз там и разделов нет и в Вашем файле код не работает, а в приложенном работает...
Все, догнал как у Вас организовано. Т.к. колонтитулы не делятся как таковые, то фигуры в макросе определяются ВСЕ для всех разделов. И чтобы удалить правильную надо сначала определить к какой она странице относится. Не знаю пока можно ли это сделать вообще.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

Дмитрий Щербаков(The_Prist)

А Вам надо вообще колонтитул удалить или там может быть какой-то текст и удалить надо именно картинку?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

Дмитрий Щербаков(The_Prist)

В общем пока получилось только удалить все картинки колонтитула, оставив текст.
Dim D As Word.Document
   Dim Sec As Section
   Dim Hd As Word.HeaderFooter
   Dim N As Long
   
   ' документ
   Set D = ActiveDocument ' заменить вашим
   Set Sec = D.Sections(D.Sections.Count)
   N = Sec.Range.Information(Type:=Word.wdActiveEndPageNumber)
'    D.Windows(1).ActivePane.View.SeekView = wdSeekCurrentPageHeader
   Set Hd = Sec.Headers(1)
   Hd.LinkToPrevious = False
   Hd.Range.Copy
   Hd.Range.PasteSpecial datatype:=wdPasteHTML
   'возвращаем вид редактирования документа, а не колонтитула
'    D.Windows(1).ActivePane.View.SeekView = 0

определить принадлежность картинки конкретному колонтитулу раздела не получилось.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

oleg4226

#13
На самом деле сделал форму с кнопками  - удалить активный лист

Selection.GoTo wdGoToPage, wdGoToAbsolute, ActivePages
Selection.Bookmarks("\page").Range.Delete


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

вот и иду последовательно -
удалить все в колонтитуле последней страницы
удалить все содержимое последней страницы
курсор на предыдущую страницу

тогда думаю последняя страница исчезнет
плюс еще надо будет поменять Разрыв раздела на следующей странице
поменять на Разрыв раздела на текущей странице на предыдущей странице
иначе пустой лист в конце будет вылазить

oleg4226

#14
удалить все содержимое последней страницы
курсор на предыдущую страницу

вроде работает - нашел в инете допилил

Dim ActivePages As Long
ActivePages = Selection.Information(wdActiveEndPageNumber) 'определяем номер страницы с курсором

Dim PageNumber1 As Long, PageNumber2 As Long
   Dim start_ As Long, end_ As Long
 
 
   '1. Здесь запишите в переменные номера страниц, которые нужно выделить.
'    PageNumber1 = InputBox("Номер начальной страницы:")
'    PageNumber2 = InputBox("Номер конечной страницы:")
   PageNumber1 = ActivePages
   PageNumber2 = ActivePages
   
   
 
'    '2. Проверка, что указанная начальная страница существует.
'    If ActiveDocument.ComputeStatistics(wdStatisticPages) < PageNumber1 Then
'        MsgBox "В файле нет указанной начальной страницы.", vbExclamation
'        Exit Sub
'    End If
'
'    '3. Проверка, что указанная конечная страница существует.
'    If ActiveDocument.ComputeStatistics(wdStatisticPages) < PageNumber2 Then
'        MsgBox "В файле нет указанной конечной страницы.", vbExclamation
'        Exit Sub
'    End If
 
   '4. Запись в переменную начала начальной страницы.
   start_ = ActiveDocument.GoTo(What:=wdGoToPage, Which:=wdGoToAbsolute, Count:=PageNumber1).Start
 
   '5. Запись в переменную конца конечной страницы.
       ' Нужно в переменную записать начало следующей страницы после указанной конечной.
       ' Если конечная страница - это последняя страница, то запишем в переменную конец файла.
   If ActiveDocument.ComputeStatistics(wdStatisticPages) = PageNumber2 Then
       end_ = ActiveDocument.Range.End
   Else
       end_ = ActiveDocument.GoTo(What:=wdGoToPage, Which:=wdGoToAbsolute, Count:=PageNumber2 + 1).Start
   End If
 
   '6. Выделение указанных страниц.
   ActiveDocument.Range(start_, end_).Select
   Selection.Delete Unit:=wdCharacter, Count:=1
   
   start_ = ActiveDocument.GoTo(What:=wdGoToPage, Which:=wdGoToAbsolute, Count:=PageNumber1 - 1).Start
   end_ = ActiveDocument.GoTo(What:=wdGoToPage, Which:=wdGoToAbsolute, Count:=PageNumber2 - 1).Start
   ActiveDocument.Range(start_, end_).Select


теперь после удаления содержимого колонтитулов и содержимого последней страницы
перешел на предыдущую страницу - внизу осталась пустая последняя страница

как сейчас на этой странице заменить "Разрыв раздела на следующей странице" заменить на другой "Разрыв раздела на текущей странице" ?

Дмитрий Щербаков(The_Prist)

Так. Вы в одну тему зачем-то смешали все подряд. Тема изначально про удаление картинки из колонтитула. А удаление содержимого страницы и тем более замена разрывов сюда ну никак не относятся. В следующий раз просто закрою обсуждение и будете создавать новую тему - правила не просто так написаны.
По сути ответ очевиден: удалите разрыв раздела и добавьте разрыв в нужном месте.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

oleg4226

Сорри увлекся - понятно  Более не повторится

qtix

#17
У Вас последний колонтитул отдельно от остальных, что ли? Нет же такого понятия - колонтитул для каждой отдельной страницы. У Вас руками получается удалить фигуру в колонтитуле только последней страницы так, чтобы на остальных эта фигура осталась?

Zefir

Где была эта статья когда я учился сколько боли было с этими колонтитулами .... :-\

Яндекс.Метрика Рейтинг@Mail.ru