Visio dosyalarını birleştirme


4

Bunu kopyala / yapıştır kullanarak el ile yapabileceğimi biliyorum ama daha basit bir yol arıyorum.

Visio belgelerini birleştirmenin hızlı ve kolay bir yolunu bilen var mı? Hepsi aynı dahili belge tipinde (Flowchart - US Units) olan birkaç Visio vsd dosyam var Bunların her biri 1 ila 15 sayfa arasındadır. Hepsini bir Visio dosyasında birleştirmek istiyorum.

Enterprise Architects için Visio kullanıyorum (11.4301.8221) bu yüzden bu sürümde bir prosedür uygularsanız, aradığım şey budur, ancak bir 3. parti aracı veya bir makro da işe yarayabilir.

Yanıtlar:


5

Bu kolayca yapılamaz, çünkü Visio, Visio'daki sayfa nesnesinde hoş bir .Copy yöntemi sağlamaz.

Bu VBA aracılığıyla yapılabilir, ancak olması gerektiği kadar kolay değil.

Bu belgelerin her birindeki tüm sayfalarda kopyalayacağı bir dosya adı dizisini geçerek kullanabileceğiniz bazı VBA kodlarını aşağıya yapıştıracağım. Bununla birlikte, şu anda benim için çok fazla olduğu için sayfa düzeyinde hiçbir şekil sayfası değerini kopyalamayacağını unutmayın ... bu yüzden sadece şekiller kopyalıyorsanız, bunun sizin için çalışması gerekir (TryMergeDocs alt, bunu test etmek için kullandığım şeydi, ve iyi çalışıyor gibi görünüyor) ...

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

Teşekkür ederim. Bunu bugün deneyeceğim! eğer işe yararsa, size oy vermeye ve cevabı söz verildiği gibi kabul etmeye geri döneceğim.
David Stratton

Bir dereceye kadar Necroing, ancak kullanabilirsiniz Visio.ActivePage.SelectAll Bunların arasında bisiklet sürmek yerine yöntem
David Colwell

3

Benzer bir problemim vardı, ancak bir sayfanın arka planını da kopyalamak istedim. Bu nedenle, CopyPage yordamına aşağıdaki satırı ekledim:

DestPage.Background = CopyPage.Background

Ve MergeDocuments yordamında CurrDoc.Pages üzerinden başka bir döngü ekledi:

For Each CurrPage In CurrDoc.Pages
    Set CurrDestPage = DestDoc.Pages(CurrPage.Name)
    SetBackground CurrPage, CurrDestPage
Next CurrPage

SetBackground prosedürü çok basittir:

Sub SetBackground(CopyPage As Visio.Page, DestPage As Visio.Page)
   If Not CopyPage.BackPage Is Nothing Then
       DestPage.BackPage = CopyPage.BackPage.Name
   End If
End Sub

Ve bu çalıştı. Belki sb faydalı bulabilir.


+1. Güzel bir ek ve eminim yardımcı olacaktır!
David Stratton

2

Bir çözümü paylaştığınız için teşekkür ederiz.

Jon'un çözümünün "birleştirme" ve user26852'in ekini kopyalayıp yapıştırmama izin verin :-)

Bu benim için bir cazibe gibi çalışan tam makro:

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
                SetBackground 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
    DestPage.Background = CopyPage.Background


    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

Sub SetBackground(CopyPage As Visio.Page, DestPage As Visio.Page)
   If Not CopyPage.BackPage Is Nothing Then
       DestPage.BackPage = CopyPage.BackPage.Name
   End If
End Sub

Yine de bir şey: Sayfalarımdaki bir katmanda "kilidi" tekrar kontrol etmem gerekti. "Katman özellikleri" nin Makro tarafından çoğaltılmadığını varsayıyorum. Benim için bütün arka plan katmanlarımı tekrar kilitlemek önemli değildi. Ancak bir başkası için, katman özelliklerinin nasıl kopyalanacağı / yapıştırılacağı konusunda biraz daha ileri bakmaya değebilir.


1

Bu sorunla karşılaştım ve Nesne Ekle işlevini kullanarak sorunun üstesinden geldim.

  • Araç çubuğundan 'Ekle'yi seçin
  • Açılan menüden 'Nesne'yi seçin
  • 'Dosyadan oluştur' seçeneğini seçin
  • 'Microsoft Office Visio Çizimini' seçin
  • 'Dosyaya bağla'yı seçin
  • 'Gözat' üzerine tıklayın
  • Eklemek istediğiniz dosyayı seçin
  • 'Aç' düğmesini tıklayın
  • 'Tamam'ı tıklayın

VSD dosyası, orijinal dosyayı açarak veya 'Object' için Visio'ya çift tıklayarak ve açarak güncellenebilecek bir resim olarak eklenecektir.


1

Visio Super Utilities sayfasından indirin:
http://www.sandrila.co.uk/visio-utilities/

Yüklemeye, indirilen pakette install_readme.txt verilir. Lütfen kuruluma bakın. Visio Super Utilities yüklendikten sonra, Visio belgelerini birleştirmek için aşağıdaki adımları izleyin

  1. Birleştirmek istediğiniz 2 Visio belgesini açın.
  2. Eklentilere Git - & gt; SuperUtils - & gt; Belge - & gt; Belgeyi Diğer Belgeye Kopyala

Her kaynak belge için bunu tekrarlayın.


İndirme işlemi tamamen işlevseldir ve yerleşik araçlardan herhangi birini 20 ücretsiz kullanma imkanı sunar. Bu doğru değil. Kayıtsız bir hatayla karşılaştığımda kopya işlevini nasıl kullanacağını deneyemiyorum.
Paktas

0

Son derece yararlı senaryo için teşekkürler. Senaryoyu proses mühendisliği addon ile daha uyumlu hale getirmek için bazı satırlar ekledim. (Borular, vanalar ve visiolu malzemeler çiziyorsanız bu devreye girer) vba-script'i çalıştırırken otomatik numaralandırmayı veya etiketlemeyi devre dışı bırakmak için vba-script'i çalıştırırken aşağıdaki satırları ekleyin:

' Disable PE automatic editing while copying
Dim prevPEUserOptions As Integer
Dim PEEnabled As Integer
If  DestDoc.DocumentSheet.CellExists("User.PEUserOptions", 1) Then
    PEEnabled = 1
    prevPEUserOptions = DestDoc.DocumentSheet.Cells("User.PEUserOptions")
    DestDoc.DocumentSheet.Cells("User.PEUserOptions") = 0
End If

ve sonunda bunlar:

If (PEEnabled) Then
    DestDoc.DocumentSheet.Cells("User.PEUserOptions") = prevPEUserOptions
End If

Bence, yalnızca senaryoyu zaten hedeflenmiş bir belgeyle çalıştırıyorsanız, buna ihtiyacınız olacak. Belki başka biri bunu faydalı bulacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.