Форум пользователей Visio http://visio.getbb.ru/ |
|
Копирование листа http://visio.getbb.ru/viewtopic.php?f=6&t=1049 |
Страница 3 из 4 |
Автор: | Shishok [ 14 ноя 2016, 23:38 ] |
Заголовок сообщения: | Re: Копирование листа |
Цитата: Наверное, в Visio можно сделать аналогично. Можно, конечно: Код: Dim oDoc As Visio.Document
Set oDoc = Application.Documents.Add("") ' Код ' Код oDoc.SaveAs "path\filename.vsd" oDoc.Close |
Автор: | Alex_ST [ 15 ноя 2016, 13:06 ] |
Заголовок сообщения: | Re: Копирование листа |
Ребята, всё оказалось намного проще! Читаем внимательно Справку по методам Shape.Copy & Shape.Paste и видим, что у обоих методов, оказывается, есть флаги методов копирования/вставки: visCopyPasteNormal == 0 - Default value. Shapes are copied/pasted to the center of the active window. visCopyPasteNoTranslate == 1 - Shapes are copied/pasted to their original coordinate locations Поэтому никакоая возня с группировкой, правкой формул и разгруппировкой, похоже, НЕ НУЖНА! Сейчас буду пробовать. За одно подумаю, как бы поэлегантнее CellsSRC страницы передать новой странице? Ну не нравится мне поэлементный копипаст Тем более, что 8 элементов, боюсь, маловато будет. Надо ещё и ориентацию страницы копировать, и из visRowPageLayout ещё 5 параметров. В общем, надо попробовать цикл хотя бы присобачить. |
Автор: | Shishok [ 15 ноя 2016, 13:25 ] |
Заголовок сообщения: | Re: Копирование листа |
Я смотрю ты глубоко погрузился в объектную модель Visio. По поводу: Цитата: За одно подумаю, как бы поэлегантнее CellsSRC страницы передать новой странице? А это не увидел? http://visio.getbb.ru/viewtopic.php?f=15&t=1047 |
Автор: | Alex_ST [ 15 ноя 2016, 13:53 ] |
Заголовок сообщения: | Re: Копирование листа |
Shishok писал(а): А это не увидел? Там ссылка на файл на Яндекс.Диске. А я с работы до него не достаю. Но, судя по обсуждению, там копирование по одному параметру. Так я и сам уже когда-то делал. Вот подпрограмма с комментариями из моего старого проекта, в котором изо всех открытых документов листы собирались в один новый:Содержимое спрятано под спойлер ↓Спойлер: ▼ И, к стати, твою процедурку Duplucate_Here я уже покоцал и протестировал с флагами копи-паста. Только пока ещё красоту не навёл. Отлично работает!Содержимое спрятано под спойлер ↓ Спойлер: ▼ |
Автор: | Tumanov [ 15 ноя 2016, 14:55 ] |
Заголовок сообщения: | Re: Копирование листа |
Цитата: Поэтому никакоая возня с группировкой, правкой формул и разгруппировкой, похоже, НЕ НУЖНА! Правка формул и группировка - они не на пустом месте появились... Тупое копирование шейпов - оно проходит для примитивной графики, но начинает ошибаться при наличии формул. Если копируется шейп, ссылающийся на шейп, который еще не скопирован, то формула неизбежно будет искажена. Ну не на что сослаться только что вставленному шейпу. Так что все упрощения - они могут и выглядеть крутыми и даже тестироваться хорошо... Но только в своей области применения. |
Автор: | Shishok [ 15 ноя 2016, 15:13 ] |
Заголовок сообщения: | Re: Копирование листа |
Цитата: Но, судя по обсуждению, там копирование по одному параметру Что это значит? Там копирование целыми секциями(разделами). Например за раз копируется вот это все: |
Автор: | Alex_ST [ 15 ноя 2016, 16:15 ] |
Заголовок сообщения: | Re: Копирование листа |
Shishok писал(а): Там копирование целыми секциями(разделами) Ну я же говорил:Alex_ST писал(а): Там ссылка на файл на Яндекс.Диске. А я с работы до него не достаю Значит, моё предположение о том, чтоAlex_ST писал(а): … судя по обсуждению, там копирование по одному параметру. оказалось не верным. Из дома вечером посмотрю.Tumanov писал(а): Тупое копирование шейпов - оно проходит для примитивной графики ну, это значит - для меня Значит так: с копированием свойств страницы сейчас пока заниматься не буду. Займусь копированием не выделяемых по ActiveWindow.SelectAll подложек ( шейпов, у которых .CellsC(visLayerLock)=True ). Это, похоже, совсем не сложно сделать с использованием словарей. А уже в конце проекта можно будет попробовать сделать не фиксированное, а динамически изменяемое в зависимости от количества открытых документов меню для выбора Destination. (На Excel у меня это получалось, но в Visio может быть засада с событиями - пока не вник как с ними работать. Посмотрим) |
Автор: | Alex_ST [ 15 ноя 2016, 17:38 ] |
Заголовок сообщения: | Re: Копирование листа |
Ну вот. Разлочивание слоёв перед копированием и залочивание их обратно сделалСодержимое спрятано под спойлер ↓ Спойлер: ▼ |
Автор: | Alex_ST [ 16 ноя 2016, 13:28 ] |
Заголовок сообщения: | Re: Копирование свойств (на VBA) |
Shishok, Копаясь с копированием листа и не видя твою (т.к. ЯД с работы закрыт собаками-сисадминами ), я написал такую процедуру копирования свойств листов:Содержимое спрятано под спойлер ↓ Спойлер: ▼ И к тому же при необходимости работы с другими объектами копируемые секции и ряды элементарно можно либо просто изменить в коде, либо переделать процедуру в универсальную, добавив ей в аргументы массивы сканируемых параметров, а не задавая их внутри. |
Автор: | Shishok [ 16 ноя 2016, 13:38 ] |
Заголовок сообщения: | Re: Копирование свойств (на VBA) |
Ну приблизительно и у меня так же. Но это только для, так сказать , штатных секций страницы. А вот Shape Data, User Defined Cells, Scratch, Actions, Hyperlinks и Layers - это отдельная песня. Ну может оно тебе и не надо. |
Автор: | Alex_ST [ 16 ноя 2016, 13:42 ] |
Заголовок сообщения: | Re: Копирование листа |
Alex_ST писал(а): Процедуры GetPageSettings и SetPageSettings завтра объединю в одну CopyPageSettings Переделал.Кроме того, обнаружил, что .Index у слоя может измениться при копировании и потому не правильно восстановиться из словаря. Переделал на запоминание в словаре .Name залоченных слоёв. Вроде бы работает. Проверьте кто-нибудь ещё, пожалуйста. Duplucate_HereСодержимое спрятано под спойлер ↓ Спойлер: ▼ Спойлер: ▼ Спойлер: ▼ Сначала поэкспериментирую в в любимом и привычном Excel, а потом уже переложу на Visio/ Боюсь, правда, что без использования юзер-формы и модулей класса не обойтись. А это - отдельные модули проекта, что затрудняет его копирование, т.к. приходится делать жёсткую привязку к их именам. Да и с модулями класса я очень слаб, к сожалению |
Автор: | Alex_ST [ 16 ноя 2016, 13:56 ] |
Заголовок сообщения: | Re: Копирование свойств (на VBA) |
Ну в принципе-то моя процедура хоть и привязана к объектам, но принцип сканирования по трём массивам параметров применим практически везде. Я, к стати, специально именно поэтому не стал сканировать только по одному нужному мне значению секции, а задал её как массив из одного элемента: Код: Dim arSection(): arSection = Array(visSectionObject)
|
Автор: | Alex_ST [ 16 ноя 2016, 13:59 ] |
Заголовок сообщения: | Re: Копирование свойств (на VBA) |
Shishok писал(а): А вот Shape Data, User Defined Cells, Scratch, Actions, Hyperlinks и Layers - это отдельная песня. С Shape Data, User Defined Cells, Scratch, Actions, Hyperlinks я ещё пока не сталкивался (просто не было необходимости), а вот с Layers никаких затруднений не возникло при сканировании для копирования листов. При этом там я процедуру запоминания в словаре упростил до запоминания только значений .CellsC(visLayerLock) , но ничего не мешало пробежаться по всем значениям каждого слоя и запоминать массивы.
|
Автор: | Shishok [ 16 ноя 2016, 14:08 ] |
Заголовок сообщения: | Re: Копирование листа |
Проверил. Не копируются не видимые слои. В принципе, собственно копирование секции слоев не нужно. Бросание на страницу шейпов принадлежащих какому то слою и так создает эти слои. |
Автор: | Shishok [ 16 ноя 2016, 14:14 ] |
Заголовок сообщения: | Re: Копирование листа |
А вообще не копирование скрытых шейпов(когда они на невидимых слоях) можно сделать опцией. Не нужен слой, условно - светильников, сделал слой с ними невидимым. |
Автор: | Alex_ST [ 16 ноя 2016, 14:35 ] |
Заголовок сообщения: | Re: Копирование листа |
Shishok писал(а): Проверил. Не копируются не видимые слои. Ну так я для невидимых и не делал. Делал только для залоченных. А про то, что невидимые тоже не выбираются при ActiveWindow.SelectAll я, естественно, забыл... Ща поправлю. К стати, Duplucate_Here_To у меня почему-то работает, но не лочит слои в получателе… Буду проверять. Да и я там ещё забыл процедуры GetPageSettings и SetPageSettings заменить на Duplicate_Page_CellsSRC. Правлю прямо там. |
Автор: | Alex_ST [ 16 ноя 2016, 15:46 ] |
Заголовок сообщения: | Re: Копирование листа |
Alex_ST писал(а): Duplucate_Here_To у меня почему-то работает, но не лочит слои в получателе… Нашёл, где собака порылась. Оказывается, после выполнения команды Код: Set oNewPage = ActiveDocument.Pages.Add окно, содержащее oNewPage , активизируется и потому к нему можно обращаться как к ActiveWindow.Page (что в общем-то вполне логично).Но после выполнения команды Код: Set oNewPage = oOtherDoc.Pages.Add не только не автивизируется окно, содержащее oNewPage , но не активизируется даже и сам oOtherDocПоэтому к нему нельзя обращаться как к ActiveWindow. Обновлённые процедуры здесь под спойлеромСодержимое спрятано под спойлер ↓ Спойлер: ▼ |
Автор: | Shishok [ 16 ноя 2016, 16:10 ] |
Заголовок сообщения: | Re: Копирование листа |
Цитата: если известен лист oNewPage (As Visio.Page естественно), то какой командой можно активировать его окно? Если oNewPage находится в активном сейчас документе: Код: ActiveWindow.Page = oNewPage А если не в активном, то сначала активируем окно этого документа: Код: Windows.ItemEx("заголовок окна этого документа").Activate или: Код: Windows.Item("индекс окна в коллекции Windows").Activate
|
Автор: | Alex_ST [ 16 ноя 2016, 16:34 ] |
Заголовок сообщения: | Re: Копирование листа |
Shishok писал(а): "заголовок окна этого документа" Это ведь не oNewPage.Name ? Это по крайней мере oOtherDoc.Name Ну так как выглядит команда активации окна документа, содержащего oNewPage ? |
Автор: | Shishok [ 16 ноя 2016, 16:51 ] |
Заголовок сообщения: | Re: Копирование листа |
Windows.ItemEx(oOtherDoc.Name).Activate |
Страница 3 из 4 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |