Объединение файлов Visio

Я знаю, что могу сделать это вручную, с помощью копировать/вставить, но я ищу более простой способ.

кто-нибудь знает о быстрый и простой способ объединения документов Visio? У меня есть несколько файлов Visio vsd, все из которых имеют один и тот же тип внутреннего документа (блоки потоковой диаграммы - США). Каждый из них имеет от 1 до 15 страниц. Я хочу объединить их все в один файл Visio.

Я использую Visio для корпоративных архитекторов (11.4301.8221), так что если есть процедура для этого в эта версия, это то, что я ищу, но сторонний инструмент или макрос также будут работать.

4
задан David Stratton
06.03.2023 8:36 Количество просмотров материала 2905
Распечатать страницу

6 ответов

Это не может быть легко сделано, потому что Visio не обеспечивает хороший .Метод копирования на объект страницы в Visio.

Это можно сделать через VBA, но это не так просто, как я думаю.

я вставлю ниже код VBA, который вы можете использовать, передавая массив имен файлов, которые будут скопированы на всех страницах каждого из этих документов. Обратите внимание, однако, что он не будет копировать значения shapesheet на уровне страницы,так как это слишком для меня сейчас ... так что если вы просто копируя формы, это должно работать для вас (trymergedocs sub - это то, что я использовал для тестирования этого, и, похоже, работает хорошо)...

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
5
отвечен Jon Fournier 2023-03-07 16:24

у меня была аналогичная проблема, но я хотел также скопировать фон страницы. Поэтому я добавил следующую строку в процедуру CopyPage:

DestPage.Background = CopyPage.Background

и добавил еще одну петлю над CurrDoc.Страницы в процедуре MergeDocuments:

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

процедура SetBackground очень проста:

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

и это сработало. Возможно, СБ найдет это полезным.

3
отвечен 2023-03-07 18:41

спасибо всем за совместное решение.

позвольте мне скопировать / вставить "слияние" решения Джона и добавление user26852: -)

Это полный макрос, который работал как шарм для меня:

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

одна вещь, хотя: мне пришлось перепроверить "замок" на слое, который у меня был на моих страницах. Я предполагаю, что" свойства слоя " не распространяются макросом. Для меня это не было большой проблемой, чтобы повторно заблокировать все мои фоновые слои. Но для кого-то это может быть стоит посмотреть немного дальше о том, как скопировать / вставить свойства слоя тоже.

2
отвечен user940172 2023-03-07 20:58

Я столкнулся с этой проблемой и преодолел проблему, используя функцию Insert Object.

  • выберите "Вставить" из панели инструментов
  • Выберите "объект" из выпадающего меню
  • выберите Создать из файла'
  • Выберите "Microsoft Office Visio Рисунок"
  • выберите 'ссылка на файл'
  • Нажмите кнопку 'Browse'
  • Выберите файл, который вы хотите вставить
  • Нажмите 'Open'
  • клик 'OK'

файл VSD будет вставлен как изображение, которое может быть обновлено путем открытия исходного файла, или двойным щелчком мыши и открытия Visio для "объекта".

1
отвечен Dave Huntington 2023-03-07 23:15

Скачать для Visio супер коммунальных услуг от:

http://www.sandrila.co.uk/visio-utilities/

установка дана install_readme.txt в загруженном пакете. Пожалуйста см. Установка. После установки Visio Super Utilities выполните следующие действия для объединения документов Visio

  1. откройте 2 документа Visio, которые требуется объединить.
  2. перейдите в надстройки -> SuperUtils -> документ -> копировать Документ в другой документ

повторить для каждого исходного документа.

1
отвечен Mayank Agarwal 2023-03-08 01:32

Спасибо за чрезвычайно полезный скрипт. Я добавил несколько строк, чтобы сделать скрипт более совместимым с аддоном process engineering. (Это активируется, если вы рисуете трубы и клапаны и прочее с visio) для того, чтобы отключить автоматическую нумерацию или пометки при запуске VBA-скрипт добавить следующие строки в начале:

' 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

и в конце:

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

Я думаю, вам это понадобится, только если вы запускаете скрипт с уже существующий документ в качестве целевого. Возможно, кто - то еще найдет это полезным.

0
отвечен Honigmelone 2023-03-08 03:49

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх