Nie można tego łatwo zrobić, ponieważ Visio nie zapewnia ładnej metody .Copy na obiekcie strony w Visio.
Można to zrobić za pomocą VBA, ale nie jest to tak proste, jak myślę, że powinno być.
Wkleję poniżej kod VBA, którego możesz użyć, przekazując tablicę nazw plików, która skopiuje się na wszystkich stronach w każdym z tych dokumentów. Zauważ jednak, że nie skopiuje żadnych wartości arkusza kształtów na poziomie strony, ponieważ jest to dla mnie zbyt skomplikowane ... więc jeśli po prostu kopiujesz kształty, powinno to działać dla Ciebie (podmenu TryMergeDocs to to, czego użyłem do przetestowania tego, i wydaje się, że działa dobrze) ...
Private Sub TryMergeDocs()
Dim Docs() As Variant
Docs = Array("C:\Tmp\JunkVSD\Drawing1.vsd", "C:\Tmp\JunkVSD\Drawing2.vsd", "C:\Tmp\JunkVSD\Drawing3.vsd")
MergeDocuments Docs
End Sub
Sub MergeDocuments(FileNames() As Variant, Optional DestDoc As Visio.Document)
' merge into a new document if no document is provided
On Error GoTo PROC_ERR
If DestDoc Is Nothing Then
Set DestDoc = Application.Documents.Add("")
End If
Dim CheckPage As Visio.Page
Dim PagesToDelete As New Collection
For Each CheckPage In DestDoc.Pages
PagesToDelete.Add CheckPage
Next CheckPage
Set CheckPage = Nothing
' loop through the FileNames array and open each one, and copy each page into destdoc
Dim CurrFileName As String
Dim CurrDoc As Visio.Document
Dim CurrPage As Visio.Page, CurrDestPage As Visio.Page
Dim CheckNum As Long
Dim ArrIdx As Long
For ArrIdx = LBound(FileNames) To UBound(FileNames)
CurrFileName = CStr(FileNames(ArrIdx))
Set CurrDoc = Application.Documents.OpenEx(CurrFileName, visOpenRO)
For Each CurrPage In CurrDoc.Pages
Set CurrDestPage = DestDoc.Pages.Add()
With CurrDestPage
On Error Resume Next
Set CheckPage = DestDoc.Pages(CurrPage.Name)
If Not CheckPage Is Nothing Then
While Not CheckPage Is Nothing ' handle duplicate names by putting (#) after the original name
CheckNum = CheckNum + 1
Set CheckPage = Nothing
Set CheckPage = DestDoc.Pages(CurrPage.Name & "(" & CStr(CheckNum) & ")")
Wend
CurrDestPage.Name = CurrPage.Name & "(" & CStr(CheckNum) & ")"
Else
CurrDestPage.Name = CurrPage.Name
End If
On Error GoTo PROC_ERR
Set CheckPage = Nothing
CheckNum = 0
' copy the page contents over
CopyPage CurrPage, CurrDestPage
End With
DoEvents
Next CurrPage
DoEvents
Application.AlertResponse = 7
CurrDoc.Close
Next ArrIdx
For Each CheckPage In PagesToDelete
CheckPage.Delete 0
Next CheckPage
PROC_END:
Application.AlertResponse = 0
Exit Sub
PROC_ERR:
MsgBox Err.Number & vbCr & Err.Description
GoTo PROC_END
End Sub
Sub CopyPage(CopyPage As Visio.Page, DestPage As Visio.Page)
Dim TheSelection As Visio.Selection
Dim CurrShp As Visio.Shape
DoEvents
Visio.Application.ActiveWindow.DeselectAll
DestPage.PageSheet.CellsSRC(visSectionObject, visRowPage, visPageHeight).Formula = CopyPage.PageSheet.CellsSRC(visSectionObject, visRowPage, visPageHeight).ResultIU
DestPage.PageSheet.CellsSRC(visSectionObject, visRowPage, visPageWidth).Formula = CopyPage.PageSheet.CellsSRC(visSectionObject, visRowPage, visPageWidth).ResultIU
Set TheSelection = Visio.ActiveWindow.Selection
For Each CurrShp In CopyPage.Shapes
TheSelection.Select CurrShp, visSelect
DoEvents
Next
TheSelection.Copy visCopyPasteNoTranslate
DestPage.Paste visCopyPasteNoTranslate
TheSelection.DeselectAll
End Sub
Visio.ActivePage.SelectAll
metody zamiast jeździć na rowerzeMiałem podobny problem, ale chciałem też skopiować tło strony. Dlatego dodałem następujący wiersz w procedurze CopyPage:
I dodał kolejną pętlę do CurrDoc.Pages w procedurze MergeDocuments:
Procedura SetBackground jest bardzo prosta:
I to zadziałało. Może komuś się to przyda.
źródło
Dziękujemy wszystkim za udostępnienie rozwiązania.
Pozwól mi skopiować / wkleić „scalenie” rozwiązania Jona i dodatku user26852 :-)
Oto pełne makro, które działało dla mnie jak urok:
Jedno tylko: musiałem ponownie sprawdzić „blokadę” na warstwie, którą miałem na swoich stronach. Zakładam, że „właściwości warstwy” nie są propagowane przez makro. Dla mnie nie było wielkim problemem ponowne zablokowanie wszystkich moich warstw tła. Ale dla kogoś innego może warto zastanowić się, jak skopiować / wkleić właściwości warstwy.
źródło
Natknąłem się na ten problem i przezwyciężyłem problem za pomocą funkcji Wstaw obiekt.
Plik VSD zostanie wstawiony jako obraz, który można zaktualizować, otwierając oryginalny plik lub klikając dwukrotnie i otwierając Visio dla „Obiektu”.
źródło
Pobierz Visio Super Utilities z:
http://www.sandrila.co.uk/visio-utilities/
Instalator otrzymuje plik install_readme.txt w pobranym pakiecie. Proszę odnieść się do instalacji. Po zainstalowaniu programu Visio Super Utilities wykonaj następujące czynności, aby połączyć dokumenty Visio
Powtórz to dla każdego dokumentu źródłowego.
źródło
Dzięki za niezwykle pomocny skrypt. Dodałem kilka wierszy, aby skrypt był bardziej kompatybilny z dodatkiem do inżynierii procesowej. (Aktywuje się, jeśli rysujesz rury, zawory i inne rzeczy przy pomocy Visio) Aby wyłączyć automatyczne numerowanie lub tagowanie podczas uruchamiania skryptu vba, dodaj następujące wiersze na początku:
a te na końcu:
Myślę, że będzie to potrzebne tylko wtedy, gdy uruchamiasz skrypt z już istniejącym dokumentem jako celem. Być może ktoś inny uzna to za pomocne.
źródło