Excel это не сложно
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
25.01.2021, 12:30:17

Войти
На форуме добавлена возможность подписки на RSS-ленты любого раздела форума. Подписаться можно, нажав на иконку RSS , расположенную левее наименования раздела.
31 745 Сообщений в 5 102 Тем от 11 631 Пользователей
Последний пользователь: victiarenu
*
Перейти на сайт Хитрости Надстройка MulTEx Обучающие тренинги Наша группа ВКонтакте
Правила форума Начало Помощь Поиск Календарь Войти Регистрация Выйти
+  Excel это не сложно
|-+  Основные форумы
| |-+  Вопросы по Word и VBA
| | |-+  WORD Удалить фигуру из верхнего колонтитула
Страниц: [1] 2  Все   Вниз
Печать
Автор Тема: WORD Удалить фигуру из верхнего колонтитула  (Прочитано 7186 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
oleg4226
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 12


Просмотр профиля E-mail
« : 12.09.2019, 09:05:48 »

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

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

Макрорекодер выдал следущее:
Код: (vb)

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


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

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

Код: (vb)

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)
Администратор
Ветеран
*****

Репутация: +458/-0
Офлайн Офлайн

Сообщений: 5 387



Просмотр профиля WWW
« Ответ #1 : 12.09.2019, 09:08:33 »

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

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
oleg4226
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 12


Просмотр профиля E-mail
« Ответ #2 : 12.09.2019, 09:20:34 »

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

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

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

Записан
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +458/-0
Офлайн Офлайн

Сообщений: 5 387



Просмотр профиля WWW
« Ответ #3 : 12.09.2019, 09:22:28 »

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

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +458/-0
Офлайн Офлайн

Сообщений: 5 387



Просмотр профиля WWW
« Ответ #4 : 12.09.2019, 09:38:18 »

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

'чтобы обращаться к 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

Удаляет последнюю картинку или единственную.
« Последнее редактирование: 12.09.2019, 09:40:20 от Дмитрий Щербаков(The_Prist) » Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
oleg4226
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 12


Просмотр профиля E-mail
« Ответ #5 : 12.09.2019, 09:43:04 »

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

к сожалению ваш макрос почемуто не удаляет фигуру в верхнем колонтитуле на последнем листе Грустный
« Последнее редактирование: 12.09.2019, 10:08:31 от oleg4226 » Записан
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +458/-0
Офлайн Офлайн

Сообщений: 5 387



Просмотр профиля WWW
« Ответ #6 : 12.09.2019, 10:06:52 »

Готовый код:
Код: (vb)
    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

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

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
oleg4226
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 12


Просмотр профиля E-mail
« Ответ #7 : 12.09.2019, 10:18:34 »

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

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

пишет
Run-time error 5941
Запрашиваемый номер семейства не существует
Записан
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +458/-0
Офлайн Офлайн

Сообщений: 5 387



Просмотр профиля WWW
« Ответ #8 : 12.09.2019, 10:39:57 »

У меня на Вашем же примере все работает. Посмотрите чему равно D.Sections.Count и что в N попадает. Ну и убедитесь, что на момент запуска активен правильный документ - может в активном документе нет верхнего колонтитула.
Почему нельзя - страницы же разделами разделены ?
И что? Раздел и колонтитул - это разные вещи. Колонтитул создается для документа в целом, а не для каждого раздела в отдельности. Еще раз повторю вопрос: получилось у Вас вручную изменить колонтитул ТОЛЬКО НА ОДНОЙ странице так, чтобы колонтитулы на других страницах при этом не изменились?
« Последнее редактирование: 12.09.2019, 10:42:06 от Дмитрий Щербаков(The_Prist) » Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
oleg4226
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 12


Просмотр профиля E-mail
« Ответ #9 : 12.09.2019, 10:59:14 »

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

Записан
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +458/-0
Офлайн Офлайн

Сообщений: 5 387



Просмотр профиля WWW
« Ответ #10 : 12.09.2019, 11:19:40 »

Ну я не знаю - в приложенном примере это точно не работает, колонтитул удаляется везде. Вероятно, пример неудачный. Раз там и разделов нет и в Вашем файле код не работает, а в приложенном работает...
Все, догнал как у Вас организовано. Т.к. колонтитулы не делятся как таковые, то фигуры в макросе определяются ВСЕ для всех разделов. И чтобы удалить правильную надо сначала определить к какой она странице относится. Не знаю пока можно ли это сделать вообще.
« Последнее редактирование: 12.09.2019, 11:27:07 от Дмитрий Щербаков(The_Prist) » Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +458/-0
Офлайн Офлайн

Сообщений: 5 387



Просмотр профиля WWW
« Ответ #11 : 12.09.2019, 11:39:40 »

А Вам надо вообще колонтитул удалить или там может быть какой-то текст и удалить надо именно картинку?
Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +458/-0
Офлайн Офлайн

Сообщений: 5 387



Просмотр профиля WWW
« Ответ #12 : 12.09.2019, 12:09:19 »

В общем пока получилось только удалить все картинки колонтитула, оставив текст.
Код: (vb)
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

определить принадлежность картинки конкретному колонтитулу раздела не получилось.
Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
oleg4226
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 12


Просмотр профиля E-mail
« Ответ #13 : 12.09.2019, 12:15:08 »

На самом деле сделал форму с кнопками  - удалить активный лист
Код: (vb)

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


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

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

тогда думаю последняя страница исчезнет
плюс еще надо будет поменять Разрыв раздела на следующей странице
поменять на Разрыв раздела на текущей странице на предыдущей странице
иначе пустой лист в конце будет вылазить
« Последнее редактирование: 12.09.2019, 12:19:38 от oleg4226 » Записан
oleg4226
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 12


Просмотр профиля E-mail
« Ответ #14 : 12.09.2019, 13:55:48 »

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

вроде работает - нашел в инете допилил
Код: (vb)

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


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

как сейчас на этой странице заменить "Разрыв раздела на следующей странице" заменить на другой "Разрыв раздела на текущей странице" ?
« Последнее редактирование: 12.09.2019, 14:02:32 от oleg4226 » Записан
Страниц: [1] 2  Все   Вверх
Печать
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2011, Simple Machines Valid XHTML 1.0! Valid CSS!
Яндекс.Метрика Рейтинг@Mail.ru