Mesclar arquivos do Visio

4

Sei que posso fazer isso manualmente usando copiar / colar, mas estou procurando uma maneira mais simples.

Alguém sabe de uma maneira rápida e fácil de mesclar documentos do Visio? Eu tenho vários arquivos vsd do Visio, todos os quais são o mesmo tipo de documento interno (Fluxograma - Unidades dos EUA). Cada um deles tem entre 1 e 15 páginas. Eu gostaria de combiná-los todos em um arquivo do Visio.

Estou usando o Visio for Enterprise Architects (11.4301.8221), portanto, se houver um procedimento para fazer isso nessa versão, é isso que estou procurando, mas uma ferramenta de terceiros ou uma macro também funcionaria.

    
por David Stratton 04.11.2009 / 20:21

6 respostas

5

Isso não pode ser feito facilmente, porque o Visio não fornece um método legal .Copy no objeto de página no Visio.

Isso pode ser feito através do VBA, mas não é tão simples quanto eu acho que deveria ser.

Vou colar um código VBA abaixo que você pode usar, passando uma matriz de nomes de arquivos que serão copiados em todas as páginas de cada um desses documentos. No entanto, não copiaremos valores de folha de página no nível da página, pois isso está muito envolvido para mim agora ... então, se você está simplesmente copiando formas, isso deve funcionar para você (O subCD TryMergeDocs é o que eu usei para testar isso, e parece funcionar bem) ...

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
    
por 06.11.2009 / 16:08
3

Eu tive problema semelhante, mas queria também copiar o plano de fundo de uma página. Portanto, adicionei a seguinte linha no procedimento CopyPage:

DestPage.Background = CopyPage.Background

E adicionou outro loop sobre o CurrDoc.Pages no procedimento MergeDocuments:

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

O procedimento SetBackground é muito simples:

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

E isso funcionou. Talvez sb ache útil.

    
por 01.02.2010 / 17:47
2

Obrigado por compartilhar uma solução.

Deixe-me copiar / colar a "mesclagem" da solução de Jon e a adição de user26852: -)

Esta é a macro completa que funcionou como um encanto para mim:

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

Uma coisa: eu tive que verificar novamente "bloqueio" em uma camada que eu tinha em minhas páginas. Eu suponho que as "propriedades da camada" não sejam propagadas pela Macro. Para mim, isso não foi um grande problema para voltar a bloquear todas as minhas camadas de fundo. Mas para outra pessoa, talvez valha a pena procurar um pouco mais sobre como copiar / colar as propriedades da camada.

    
por 03.09.2012 / 15:53
1

Eu me deparei com esse problema e superei o problema usando a função Inserir objeto.

  • Selecione "Inserir" na barra de ferramentas
  • Selecione "Objeto" no menu suspenso
  • Selecione "Criar do arquivo"
  • Selecione "Desenho do Microsoft Office Visio"
  • Selecione "Vincular ao arquivo"
  • Clique em "Procurar"
  • Selecione o arquivo que você deseja inserir
  • Clique em "Abrir"
  • Clique em "OK"

O arquivo VSD será inserido como uma imagem, que pode ser atualizada abrindo o arquivo original ou clicando duas vezes e abrindo o Visio para o 'Objeto'.

    
por 27.06.2012 / 20:28
1

Faça o download do Visio Super Utilities em: link

A instalação recebe o arquivo install_readme.txt no pacote baixado. Por favor, consulte a instalação. Depois que o Visio Super Utilities estiver instalado, use as etapas a seguir para combinar documentos do Visio

  1. Abra os 2 documentos do Visio que você deseja combinar.
  2. Ir para suplementos - > SuperUtils - > Documento - > Copiar documento para outro documento

Repita isso para cada documento de origem.

    
por 18.03.2014 / 10:55
0

Obrigado pelo script extremamente útil. Eu adicionei algumas linhas, para tornar o script mais compatível com o addon de engenharia de processo. (Isso é ativado se você estiver desenhando canos e válvulas e coisas com visio) Para desabilitar a numeração ou marcação automática ao executar o script vba, adicione as seguintes linhas no começo:

' 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

e estes no final:

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

Acho que você só precisará disso, se estiver executando o script com um documento já existente como destino. Talvez alguém ache isso útil.

    
por 15.06.2014 / 18:17