Author |
Topic |
LeoAbyss
Russia
20 Posts |
Posted - 04/14/2011 : 09:13:01
|
Приветствую всех. Есть стенсил. Мне нужно, чтобы при создании новой страницы шейп из этого стенсила автоматически добавлялся на эту новую страницу. Добавить макрос на событие PageAdded - легко. Но как этот макрос перенести из стенсила в текущий документ? Если не совсем понятно - пример: 1. Создаем новый документ (пустой, никаких макросов нет) 2. Вставляем шэйп из стенсила (в стенсиле есть макрос отрабатывающий добавление новой страницы) 3. Вставляем новую страницу.. и вот тут должен вставится шейп из стенсила
Как-то так.. :) |
|
Surrogate
Russia
122 Posts |
Posted - 04/14/2011 : 10:05:52
|
Шейпы в пунктах 2 и 3 разные ?
† |
|
|
LeoAbyss
Russia
20 Posts |
Posted - 04/14/2011 : 10:09:41
|
Нет, это один и тот же шейп. Он и в стенсиле один. Можно создать шаблон, конечно, но, по ряду причин, его использование нежелательно. |
Edited by - LeoAbyss on 04/14/2011 10:10:21 |
|
|
Surrogate
Russia
122 Posts |
|
LeoAbyss
Russia
20 Posts |
Posted - 04/14/2011 : 10:36:41
|
Вот это прописано в макросе у стенсила:
Private Sub Document_PageAdded(ByVal Page As IVPage) Application.ActiveWindow.Page.Drop Application.Documents.Item("Штамп по ГОСТ.vss").Masters.ItemU("Штамп"), 0, 0 End Sub
Событие PageAdded не происходит. |
|
|
Surrogate
Russia
122 Posts |
Posted - 04/14/2011 : 11:06:50
|
я в событиях (events) еще не разобрался :(
в соседней ветке был пример с обработчиком событий, там для того чтоб заработал обработчик нужно было запустить стартовый макрос !
† |
|
|
LeoAbyss
Russia
20 Posts |
Posted - 04/14/2011 : 11:18:03
|
Да нет же. Вопрос не в событии (если этот же макрос поместить в ДОКУМЕНТ, то все прекрасно работает). Проблема в том, что в НОВОМ ДОКУМЕНТЕ этого макроса, естественно, нет. Этот макрос есть только у стенсила. Так вот и спрашивается - каким образов в ДОКУМЕНТЕ запустить макрос открытого и активного СТЕНСИЛА, который обрабатывает событие PageAdded в ДОКУМЕНТЕ. |
|
|
Surrogate
Russia
122 Posts |
Posted - 04/14/2011 : 11:28:33
|
Теперь понял ! у меня был пример без обработчиков события, там была такая хитрость (посоветовал Геннадий Туманов) - сам макрос записан в одном файле, жмешь в нем Alt+F11. Открываешь другой файл (в котором нет ни одного макроса) и запускаешь макрос, если указание на файл в макросе было ActiveDocument то все работает.
нечаянно форматнул флешку с этим примером, восстановил и теперь имею массу папок и файлов с именами 001, 002. вот найду выложу пример
† |
Edited by - Surrogate on 04/14/2011 11:29:22 |
|
|
LeoAbyss
Russia
20 Posts |
Posted - 04/14/2011 : 11:35:08
|
Спасибо. Жду примера. :) Потому что ничего не понимаю. :) Вроде макрос как раз и записан как ActiveDocument |
|
|
Surrogate
Russia
122 Posts |
Posted - 04/14/2011 : 11:43:07
|
те три строчки, это и был весь макрос ?
† |
|
|
LeoAbyss
Russia
20 Posts |
Posted - 04/14/2011 : 11:51:21
|
Да. Я же написал, что мне нужно просто вставлять определенный шейп на каждую вновь создаваемую страницу. |
|
|
Tumanov
Russia
1198 Posts |
Posted - 04/14/2011 : 16:29:28
|
А отслеживание события добавления страницы - это единственный вариант? Дело в том, что при этом возникает задача подсадить макрос в любой документ. С точки зрения безопасности это криминал, поэтому такая операция всячески затрудняется. А если сделать программку, которая сможет добавить определенный шейп на каждый лист документа Visio - такое не годится? Технология при этом изменится. Сначала создается документ, создаются и заполняются все листы (без штампа). Потом, когда документ закончен, запускается приложение, которое на каждый лист добавит штамп. Сам этот процесс можно обставить как "набрасывание" файла с документом на иконку на рабочем столе. При этом запустится экзешник, примет из параметров обращения имя файла, обработает файл и закроется. Можно сделать его поумнее - пусть проверяет наличие штампа на листе и, если штамп уже есть, то второй не ставит. |
|
|
Surrogate
Russia
122 Posts |
Posted - 04/14/2011 : 20:10:55
|
этот код находился во внешнем файле, открывается целевой файл запускается макрос. у меня не получалось открывать стенсилы из внешних файлов, поэтому штамп берется из файла с макросом
Option Explicit
Public WithEvents moVSD As Visio.Document
Dim pagelist As String
Private moApp As Visio.Application
Dim VSDpage As Visio.Page
Sub moVSD_Documentopened(ByVal moVSD As Visio.IVDocument)
moVsd_PageAdded
End Sub
Sub moVsd_BeforeDocumentOpen(ByVal Document As Visio.IVDocument)
PageAdd
End Sub
Sub PageAdd()
pagelist = ";"
Set moVSD = ActiveDocument
End Sub
Private Sub moVsd_PageAdded(ByVal Page As Visio.IVPage)
Dim mast As Master
Set VSDpage = ActivePage
Set mast = ThisDocument.Masters.ItemU("Штамп")
VSDpage.Drop Application.Documents.Item("Gost.vss").Masters.ItemU("Штамп"), 0, 0
End Sub † |
Edited by - Surrogate on 04/14/2011 20:45:17 |
|
|
LeoAbyss
Russia
20 Posts |
Posted - 04/15/2011 : 05:10:57
|
Нет, использовать стороннюю программу не получится. Да и неудобно это для пользователя, в общем-то. Штамп ведь занимает некоторое количество пространства листа и пользователю придется постоянно об этом думать. Неужели нет никаких способов (кроме шаблона) вставки объекта на вновь создаваемую страницу? |
|
|
Surrogate
Russia
122 Posts |
Posted - 04/15/2011 : 07:57:38
|
почему нельзя пользоваться сторонним макросом ? у вас в компании айтишниками запрещено использовать макросы (у нас было такое одно время) в чем неудобство - прикрутил макрос, назначил на него кнопку или комбинацию клавиш и создавай хоть миллион страниц ... про занятие штампом некоторого места на листе тоже не понял: бывают штампы с автопозиционированием (на этом сайте в разделе "Склад полезных материалов" или на главной странице есть новость от 16.10.2009 г., где размещены мои автопозиционирующиеся штампы)
† |
|
|
LeoAbyss
Russia
20 Posts |
Posted - 04/15/2011 : 11:31:44
|
Эти макросы придется всем ставить же!! :) А потом и обновлять постоянно.. А народу много. :) А тут - лежит файлик в сети - открыл его - вставил штамп. А насчет штампов - это я господину Туманову говорил. Что неудобно сначала начертить - а потом штамп вставить. |
|
|
Topic |
|