Идентификатор фигуры уникален только для ее страницы, поэтому новая фигура, вставленная на страницу 1, получит новый идентификатор и, следовательно, полученную ошибку. Хотя метод Duplicate
возвращает ссылку на форму для новой формы, Paste
не делает этого, поэтому вам нужно получить ссылку на нее другими способами - либо предполагая что-то о выборе окна (согласно ответу Суррогата), либо по индексу:
Dim shp As Visio.Shape
Dim pag As Visio.Page
Set pag = ActivePage 'or some alternative reference to Page-1
Set shp = pag.Shapes.ItemU(pag.Shapes.Count)
Debug.Print shp.Index
Более обычным рабочим процессом будет генерирование мастеров (в документе трафарета), а затем отбрасывание этих мастеров, а не копирование и вставка между страницами, но ваш сценарий может потребовать другого подхода.
Я добавлю эту ссылку как полезную ссылку для работы со свойствами индекса и идентификатора:
[Update]
@ Комментарий Джона Фурнье, приведенный ниже, совершенно прав, что вышесказанное делает предположения. Например, если ячейка DisplayLevel
в исходной фигуре меньше самой верхней фигуры, она будет вставлена в коллекцию фигур страницы с соответствующим индексом, поэтому счетчик не вернет правильную форму. ID. * * +1021
Альтернативным подходом может быть прослушивание события ShapeAdded
на страницах (или страницах). Ниже приведена небольшая адаптация примера IsInScope
в документах с кодом, размещенным в ThisDocument. Это позволяет вам добавлять и добавлять код в пару идентификаторов области событий, которую вы можете проверить при обработке события ShapeAdded:
Private WithEvents vPags As Visio.Pages
Private pastedScopeID As Long
Public Sub TestCopyAndPaste()
Dim vDoc As Visio.Document
Set vDoc = Me 'assumes code is in ThisDocument class module, but change as required
Dim srcPag As Visio.Page
Set srcPag = vDoc.Pages.ItemU("Page-2")
Dim targetPag As Visio.Page
Set targetPag = vDoc.Pages.ItemU("Page-1")
Dim srcShp As Visio.Shape
Set srcShp = srcPag.Shapes.ItemFromID(12)
Set vPags = vDoc.Pages
pastedScopeID = Application.BeginUndoScope("Paste to page")
srcShp.Copy
targetPag.Paste
Application.EndUndoScope pastedScopeID, True
End Sub
Private Sub vPags_ShapeAdded(ByVal shp As IVShape)
If shp.Application.IsInScope(pastedScopeID) Then
Debug.Print "Application.CurrentScope " & Application.CurrentScope
Debug.Print "ShapeAdded - " & shp.NameID & " on page " & shp.ContainingPage.Name
DoSomethingToPastedShape shp
Else
Debug.Print "Application.CurrentScope " & Application.CurrentScope
End If
End Sub
Private Sub DoSomethingToPastedShape(ByVal shp As Visio.Shape)
If Not shp Is Nothing Then
shp.CellsU("FillForegnd").FormulaU = "=RGB(200, 30, 30)"
End If
End Sub