2017-02-22 11 views
-1

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

При записи макросов я нашел способ выбора отдельных элементов, как так: 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 

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

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

+1

Почему вы используете 'oItem.Item', а не только' oItem'? –

+0

Объектная модель Visio dox: https://msdn.microsoft.com/en-us/library/office/ff765377.aspx –

+0

Это выстрел в темноте и, возможно, немного неуклюжий, но попробуйте: 'vsoDocument.Application. ActiveWindow.Select oItem, visSelect' –

ответ

1

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

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

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

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

vsoDocument.Application.ActiveWindow.Select oItem, visSelect 

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

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

Вы можете просмотреть свойства, связанные с каждым объектом с помощью 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, затем Item # 2 становится первым индексом, но ваш цикл берет вас к следующий вещь, которая теперь является Item # 3. Принуждение цикла по индексу и в обратном порядке предотвращает это нежелательное поведение.

Смежные вопросы