Author |
Topic |
|
Surrogate
Russia
122 Posts |
Posted - 05/28/2010 : 09:26:19
|
Для копирования содержимого страницы из существующего файла в новый, я написал макрос. макрос записан в стенсиле.
Function GetRacks() ' получить фасады шкафов из существующего файла On Error GoTo errHandle Dim X As Integer Debug.Print Path Application.Documents.OpenEx "D:\RACKS\2.vsd", visOpenRO ' открыть документ содержащий фасады шкафов Application.ActiveWindow.SelectAll ' выделить все в открытом документе ActiveWindow.DeselectAll ' сбросить выделение For X = Application.ActiveWindow.Page.Shapes.Count To 2 Step -1 ' перебор шейпов на активной странице Debug.Print X ActiveWindow.Select Application.ActiveWindow.Page.Shapes.ItemFromID(X), 1024 ' отбрасывание шейпов находящихся внутри группы Next X Application.ActiveWindow.Selection.Copy ' копирование содержимого коллекции Selection в буфер обмена Application.ActiveWindow.Close ' закрыть документ содержащий фасады шкафов Exit Function errHandle: MsgBox Err.Description, vbCritical, "Ошибка №" & Err.Number End Function
Sub MACRO1() GetRacks ' вызов функции GetRacks Application.ActiveWindow.Page.Paste ' вставить из буфера обмена ActiveDocument.Pages(1).Shapes("Sheet.1").Delete ' удалить sheet.1 ActiveDocument.Pages(1).Shapes("Sheet.2").Delete ' удалить sheet.2 End Sub
содержимое файла он копирует и вставляет!
вопрос: как сгруппировать содержимое коллекции Selection ?
|
|
bdfy
Belarus
267 Posts |
Posted - 05/28/2010 : 10:05:31
|
selection.group ? |
|
|
Surrogate
Russia
122 Posts |
Posted - 05/28/2010 : 12:19:05
|
я пробовал selection.group. Вылетает такая вот ошибка
мне кажется, что беда в том что при группировке образуется новый шейп. а я не знаю как его программно создать и засунуть группу в этот новый шейп ?
|
Edited by - Surrogate on 05/28/2010 12:19:26 |
|
|
Tumanov
Russia
1198 Posts |
Posted - 05/28/2010 : 15:51:08
|
Через Set Set vsoGroupShape = vsoSelection.Group vsoGroupShape - это как раз и будет новый шейп-группа.
|
|
|
Surrogate
Russia
122 Posts |
Posted - 05/30/2010 : 16:47:32
|
Спасибо! |
Edited by - Surrogate on 05/30/2010 17:08:44 |
|
|
Tumanov
Russia
1198 Posts |
Posted - 05/30/2010 : 18:05:39
|
quote: а как можно добраться до шейпов вложенных в группу
Может я вопрос не понял... Если буквально, то у шейпа-группы есть коллекция Shapes (так же, как и у страницы). К членам этой коллекции можно обращаться. Выглядеть будет примерно так: ActivePage.Shapes(1).Shapes(j) (если первый шейп на странице - группа). |
|
|
Surrogate
Russia
122 Posts |
Posted - 05/30/2010 : 19:37:21
|
Да, именно это я и имел в виду!
и снова вопросы: фрагмент кода в котором я хотел удалить все шейпы содержащие текст - "xxx"
For y = 1 To ActivePage.Shapes.Count ' перебор шейпов на листе
Debug.Print y, ActivePage.Shapes(y).Name
For z = 1 To ActivePage.Shapes(y).shapes.count ' перебор шейпов внутри группы y
If ActivePage.Shapes(y).Shapes(z).text = "xxx" Then
Application.ActiveWindow.Page.Shapes(y).Delete
Exit For
Else
End If
Next z
Next y
в моем примере произошла ошибка в цикле еще на первом же шейпе, в котором не было вложенных шейпов.
можно ли как то воспользоваться коллекцией Shapes например присвоить y-тому шейпу некое имя например aGrp, и просматривать его содержимое циклом вида ?
For each aShp in aGrp хотя там тоже возможно будет ошибка в цикле, если шейп(y) не будет группой |
Edited by - Surrogate on 05/30/2010 19:57:05 |
|
|
Tumanov
Russia
1198 Posts |
Posted - 05/30/2010 : 21:03:45
|
Можно. Только сначала хорошо бы проверить, является ли шейп группой. Это делается опросом свойства Type. Для группы оно вернет значение visTypeGroup. Кажется 2. |
|
|
Surrogate
Russia
122 Posts |
Posted - 06/01/2010 : 11:29:31
|
Еще раз спасибо !
а можно программно исключать шейпы из коллекции Selection? например, у меня в файлах из которых я копирую есть шейпы расположенные за пределами печатаемого листа. Можно ли по условию не вхождения в печатаемую область листа PinX и PinY шейпа, исключить их из Selection? |
|
|
Tumanov
Russia
1198 Posts |
Posted - 06/01/2010 : 15:16:08
|
Исключаются тем же методом Select, только параметр SelectAction должен быть установлен в visDeselect. Примерно так: ActiveWindow.Select vsoShapes(3), visDeselect А выход за пределы листа придется проверять перебором по одному шейпу. |
|
|
|
Topic |
|