Использование 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. Форсирование цикла по индексу и в обратном порядке предотвращает это нежелательное поведение.