Как через VBA обратиться к конкретному слою на MasterPage
dastin / 22.01.2015, 18:55
Форум:
Версия программы:
17.3.0.772
Интересует пример не на конкретном файле с именами этих слоёв , а вообще.
В свойствах таких слоев указано
Master Type
- Master
- Master (all pages)
- Master (odd pages)
- Master (even pages)
может индексы какие есть ...
ведь есть же счетчик
Без контекста задачи трудно понять что тебе нужно. К конкретному слою можно обратиться только по имени или индексу. Если тебе нужно получить мастер слои конкретной страницы, тогда и ищи их через Page, а не через Document.
Задача:
Есть документ с произвольным количеством страниц и мастер слоев.
Необходимо по определенному пресету смасштабировать содержимое произвольного диапазона страниц и размер самих страниц по двум координатам раздельно.
Реальная цель - скомпенисировать "милую", нерегулируюмую, особенность младших лазерных принтеров печатать вместо 300*400мм - к примеру 298,9*398,5.
Драйвер принтера, как и диалог печати, не позволяют так точно масштабировать, ибо имеют шаг в 1%.
И все как бы реализуемо, пока на сцену не выходят мастер-слои. Они, родимые, при масштабировании норовят отреагировать всякий раз, как масштабируется страница - 5 страниц - пятикратное реагирование, 7 - семикратное....
Способ обойти это нашелся в выставлении флага Editable для слоев.
Т.е. при старте макроса Editable блокируются все мастер-слои, запускается отработка масштаба по пресету для выбранного диапазона. Блокировка мастер-слоев снимается, а блокировка страниц наоборот устанавливается, далее отрабатывается масштабирование для мастер слоев ... причем запустить масштабирование можно только для всех разом - именно через оставшуюся активной незаблокированную мастер страницу - по крайней мере другого способа я не нашел.
ActivePage.Shapes.All.CreateSelection
ActiveSelection.Stretch (XX / 100), (YY / 100)
Слой DeskTop и мастер-слой для всех страниц отрабатывается нормально ... а вот с odd pages и event pages выходит ерунда - отрабатывается только один из них ... слою можно сказать что он мастер - но какой именно?
Пусти цикл масштабирования сначала по мастер станицам Document, без захвата объектов с обычных страниц. Потом цикл по страницам, масштабируя их содержимое, исключая мастер страницы.
П.С. Я не помню объектную модель, но ни каких проблем с этом не должно быть.
П.С.С. Если тебе прям нужно получить эти слои по "типам", сделай цикл по страницам, и на его основе сформируй список мастер слоёв, фильтруя по имени или ID, если доступен.
Абстрактный пример цикла по слоям:
Sancho,
дык ....
мастер-страница одна и цикл надо пускать по слоям
при выборе конкретной физической страницы - на ней присутствует либо odd либо even мастер-слой
С индексами и именами? ... попробую "завести копилочку" ... но похоже придется это делать дважды - с переходом с четной на нечетную - чтобы оба слоя зацепить
Тестовый файл. Вывел имена и индексы по обоим IF в листбоксы. Всё замечательно ... но
по строке
If l.Master And l.IsSpecialLayer = False And l.Visible = True Then
вопросы - если слой видимый и либо он не Master либо он не Special - то он выводится
видимый - ДА, мастер - ДА, не Special? тогда, что такое Special?
какой из слоев - odd, а какой even по прежнему не понятно
правда есть зацепка - оставляя в стороне Grid, Desktop и Guide - их имена нельзя изменить и их индекс всегда 0 - по результату сравнения 1 и 3 колонок можно вычислить что в третьей колонке нет именно какого-то из odd/even ...
добавлено
блин ... балбес ....
If l.Master And l.IsSpecialLayer = False And l.Visible = False
это и есть ОН - второй из odd/even
dastin, ну хоть маленько смотри в объектную модель... про Special там чётко написано что это такое.
odd — нечётный.
even — чётный.
эх Sancho! Я ж как тот сапожник - за дело взялся первый раз. Чего поправить ... а вот написать. Спасибо! Попробуем ...
надо ещё чтобы от Х5 до Х7 заводилось, но вроде я функций нигде не использовал
показывает - что
Layer3.Editable = False
но по факту - слой остается редактируемым
и так тоже не работает
dastin, как ты смог проверить редактируемый он или нет, если на этой странице его не видно? В кореле все слои могут иметь индивидуальные настройки на каждой странице!!! Если тебе нужно заблокировать слой на всех страницах, это нужно делать или через ActiveDocument.MasterPage или циклом по всем страницам, точно не скажу.
Страницы