Использование Excel для создания диаграммы Visio - использование метода select в выражении IF

В настоящее время я интегрирую Excel с Visio для автоматического заполнения некоторых элементов в виде диаграммы. Я так далеко продвинулся в этом усилии, но застрял между документацией, макросъемками и фактически делаю то, что я хочу.

Записывая макросы, я нашел способ выбора отдельных элементов, например, так:ActiveWindow.Select Application.ActiveWindow.Page.Shapes.ItemFromID(216), visSelect

У меня есть цикл в моем сценарии следующим образом:

For Each oItem In vsoDocument.Pages(sitePage).Shapes
    If oItem.Name <> "Sheet.2" Then
        'vsoDocument.Pages(sitePage).Select oItem.Item, visSelect ' NOW REMOVED
        oItem.DeleteEx (visDeleteNormal)
        Debug.Print oItem.Name
    End If
Next oItem

ОБНОВЛЕНИЕ: Исходя из ваших ответов и проверок работоспособности, вы правы в том, что мне не нужно выбирать форму. Я изменил код, чтобы просто показать oItem.DeleteEx (visDeleteNormal) сейчас и это работает как положено. Однако на моем листе осталось несколько фигур, например, с именем "Ethernet.46". Я не знаю, почему некоторые фигуры были удалены, а также почему был удален фон страницы. Я обнаружил, что если я запускаю цикл For один раз, добавляю фон обратно в WITH vsoDocument.Pages(sitePage).BackPage, затем снова запустите цикл For еще 5 раз подряд, и он, наконец, удалит все фигуры.

ВОПРОС: Почему мой цикл For ведет себя ненадежно?

1 ответ

Решение

линия.Select терпит неудачу, и я почти уверен, что это вызов oItem.Item

Select линия терпит неудачу, потому что Page объект не имеет Select метод. Это относится к Window объект. С докса похоже oItem.Item также не удастся, так что вы можете просто использовать oItem который сам по себе является Shape объект.

Каков правильный синтаксис этой команды в этом цикле?

Возможно следующим образом:

vsoDocument.Application.ActiveWindow.Select oItem, visSelect 

Однако из предоставленного вами кода непонятно: зачем вам Select форма? Обычно это не обязательно. Может быть возможно сделать то, что вы пытаетесь сделать, не полагаясь на Select совсем.

Есть ли способ, которым я мог бы ловить эту информацию сам? например, могу ли я раскрыть методы, связанные с определением oItem, например, "Имя"?

Вы можете просматривать свойства, связанные с каждым объектом, используя панель Locals в VBE, и вы можете просматривать свойства и методы либо из документации (которая обычно включает примеры и использование синтаксиса), либо из VBE, нажмите F2, чтобы открыть браузер объектов.,

Вы можете просмотреть объектную модель Visio здесь:

http://msdn.microsoft.com/en-us/library/office/ff765377.aspx

Перемещаясь по этой иерархии, вы можете просматривать события, свойства и методы Shape объект:

https://msdn.microsoft.com/en-us/library/office/ff768546.aspx

Обновить

ВСЕГДА, когда вы удаляете элементы из коллекции, вы должны делать это по индексу и в обратном порядке.

Dim i as Long
For i = vsoDocument.Pages(sitePage).Shapes.Count to 1 Step - 1
    Set oItem = vsoDocument.Pages(sitePage).Shapes(i)
    If oItem.Name <> "Sheet.2" Then
        Debug.Print oItem.Name
        oItem.DeleteEx (visDeleteNormal)
    End If
Next oItem

Причина, по которой это необходимо, заключается в том, что когда вы Delete элемент, коллекция переиндексирует себя, поэтому, когда вы удаляете Элемент № 1, Элемент № 2 становится первым индексом, но ваш цикл переносит вас к следующему элементу, который теперь является Элементом № 3. Форсирование цикла по индексу и в обратном порядке предотвращает это нежелательное поведение.

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