Программная сортировка страниц в документе Visio с использованием VBA

Кто-нибудь знает метод сортировки страниц Visio по алфавиту с использованием VBA?

Я посмотрел, чтобы увидеть, если такой метод, как vzdVisioDocument.Pages.Sort существует, но ничего не нашел в документации или в поисках в интернете.

Нужно ли мне написать свою собственную функцию сортировки, используя Application.ActiveDocument.Pages.ItemU("Page Name").Index имущество? Это, кажется, метод, предложенный путем записи макроса действия.

3 ответа

Решение

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

Я также поменял сравнение с StrCompare из-за личных предпочтений наряду с порядком для циклов.

Sub PageSort()

    Dim titlesColl As Collection
    Set titlesColl = New Collection

    Dim i As Long
    For i = 1 To ActiveDocument.Pages.Count
        titlesColl.Add ActiveDocument.Pages.Item(i).Name
    Next i

    Dim title As Variant
    For i = 1 To ActiveDocument.Pages.Count
        For Each title In titlesColl
            If StrComp(ActiveDocument.Pages.Item(i).Name, title, vbTextCompare) < 0 Then
                ActiveDocument.Pages.Item(title).index = i
            End If
        Next title
    Next i

    Set titlesColl = Nothing

End Sub

Так что это было не так больно, как ожидалось. С vzdVisioDocument как уже определено Visio.Document:

' Make a collection of titles to iterate through
Dim colPageTitles As Collection
Set colPageTitles = New Collection

Dim intPageCounter As Integer
For intPageCounter = 1 To vzdVisioDocument.Pages.Count
    colPageTitles.Add vzdVisioDocument.Pages.Item(intPageCounter).Name
Next intPageCounter

' For each title in the collection, iterate through pages and find the appropriate new index
Dim intPageIndex As Integer
Dim varPageTitle As Variant
For Each varPageTitle In colPageTitles
    For intPageIndex = 1 To vzdVisioDocument.Pages.Count
        ' Check to see if the title comes before the index's current page title
        If StrComp(varPageTitle, vzdVisioDocument.Pages.Item(intPageIndex).Name) < 0 Then
            ' If so, set the new page index
            vzdVisioDocument.Pages.ItemU(varPageTitle).Index = intPageIndex
            Exit For
        End If
    Next intPageIndex
Next varPageTitle

' Clean up
Set colPageTitles = Nothing

Private Sub reorderPages ()

Dim PageNameU() As String

Dim isBackgroundPage As Boolean
Dim vsoPage As Visio.Page
Dim vsoCellObj As Visio.Cell

'// Get All Pages
Dim i As Integer
For Each vsoPage In ActiveDocument.Pages

    i = i + 1
    ReDim Preserve PageNameU(i)
    PageNameU(i) = vsoPage.NameU

Next vsoPage

For i = 1 To UBound(PageNameU)

    Set vsoPage = vsoPages.ItemU(PageNameU(i))
    Set vsoCellObj = vsoPage.PageSheet.Cells("UIVisibility")

    isBackgroundPage = vsoPage.Background

    '// Make foreground page to set page index
    If isBackgroundPage = True Then
        vsoCellObj.FormulaU = visUIVNormal
        vsoPage.Background = False
    End If

    vsoPage.Index = NumNonAppSysPages + i

    '// Set to background page
    If isBackgroundPage = True Then
        vsoCellObj.FormulaU = visUIVHidden
        vsoPage.Background = True
    End If

Next i

End Sub

Другие вопросы по тегам