All Forums
 Категория Visio
 Форум Вопросы и ответы
 Как определить, что шейпа не существует
Author Previous Topic Topic Next Topic  

WaW

10 Posts

Posted - 06/26/2008 :  12:43:43
Почему то в функциях VBA нет IsNothing...
Или определение несуществования шейпа производитcя с помощью другой функции?

zhuravsky

Russia
115 Posts

Posted - 06/26/2008 :  13:45:04
Ну, почему же нету:

if Shape is Nothing then
<...>
else
<...>
end if
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 06/26/2008 :  13:55:17
А это не функция :) Это оператор.
Go to Top of Page

WaW

10 Posts

Posted - 06/27/2008 :  12:39:29
Тогда что неправильно


For i = 1 To ActiveDocument.Pages.Count
    If ActiveDocument.Pages(i).Shapes("Conductor.64") Is Nothing Then
    Else
        If ActiveDocument.Pages(i).Shapes("Conductor.64").Shapes("Cond_main").Text = "" Then
            connect_flag(2) = True
            Exit For
        End If
    End If
Next


возникает ошибка на строчке

If ActiveDocument.Pages(i).Shapes("Conductor.64") Is Nothing Then



шейп "Conductor.64" находится на второй странице, ошибка возникает прии обработке первой страницы
Go to Top of Page

ukreni

Ukraine
35 Posts

Posted - 06/27/2008 :  12:51:37
А так не подойдет?

Sub q()
Dim p As Page
Dim sh As Shape

Set p = ActiveDocument.Pages(2)
For Each sh In p.Shapes
If sh.Name = "Conductor.64" Then MsgBox "OK"
Next
End Sub

Edited by - ukreni on 06/27/2008 12:53:47
Go to Top of Page

WaW

10 Posts

Posted - 06/27/2008 :  13:03:07
quote:
Originally posted by ukreni

А так не подойдет?

Sub q()
Dim p As Page
Dim sh As Shape

Set p = ActiveDocument.Pages(2)
For Each sh In p.Shapes
If sh.Name = "Conductor.64" Then MsgBox "OK"
Next
End Sub


так это конечно пройдет, но представь, что шейпов СОТНИ на странице, а страниц ДЕСЯТКИ...
Go to Top of Page

ukreni

Ukraine
35 Posts

Posted - 06/27/2008 :  13:20:51
Тогда, надеюсь, что так подойдет ...

Sub w()
Dim p As Page
Dim sh As Shape

For i = 1 To ActiveDocument.Pages.Count
Set p = ActiveDocument.Pages(i)
Set sh = p.Shapes("sheet.1")
If sh Is Nothing Then
Else
MsgBox ""
End If
Next
End Sub
Go to Top of Page

ukreni

Ukraine
35 Posts

Posted - 06/27/2008 :  13:23:35
А лучше так

Sub w()
Dim p As Page
Dim sh As Shape

For i = 1 To ActiveDocument.Pages.Count
Set p = ActiveDocument.Pages(i)
Set sh = p.Shapes("sheet.1")
If Not sh Is Nothing Then MsgBox ""
Next
End Sub
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 06/27/2008 :  15:09:37
quote:
возникает ошибка на строчке
If ActiveDocument.Pages(i).Shapes("Conductor.64") Is Nothing Then

1.
Shapes("Conductor.64") должен вернуть шейп. Но если такого шейпа нет, то возникнет ошибка. От нее нужно защищаться - расставить On Error Resume Next и On Error GoTo 0.
2.
Если произойдет ошибка в случае Set sh =..., то sh не будет указывать на Nothing. Он просто останется в прежнем состоянии.
Значит если на первой странице шейп был найден, то при проверке на второй странице (в случае ошибки) sh будет указывать на тот же шейп!
Поэтому перед проверкой следует выполнить Set sh = Nothing.
В целом конструкция должна быть примерно такой:
Dim sh As Shape
'Set sh = ActivePage.Shapes(1) 'это для иллюстрации возможной ошибки
For i = 1 To ActiveDocument.Pages.Count
On Error Resume Next
Set sh = Nothing
Set sh = ActiveDocument.Pages(i).Shapes("Conductor.64")
If sh Is Nothing Then
Else
MsgBox "Нашелся"
End If
On Error GoTo 0
Next
Go to Top of Page

WaW

10 Posts

Posted - 06/27/2008 :  15:17:04
quote:
Originally posted by Tumanov
1.
Shapes("Conductor.64") должен вернуть шейп. Но если такого шейпа нет, то возникнет ошибка. От нее нужно защищаться - расставить On Error Resume Next и On Error GoTo 0.


Жаль что только так...
Ну я это и сам прокумекал...
Думал, что есть не такой радикальный способ.

Спасибо всем за помощь.
Go to Top of Page

ESV

Ukraine
21 Posts

Posted - 08/18/2008 :  17:45:18
Для проверки существования шейпа использую следующую процедуру:

Public Function ShapeExist(visParent As Variant, shapeName As String) As Boolean
Dim tempShape As Visio.Shape
On Error GoTo ERROR
    Set tempShape = visParent.Shapes(shapeName)
    ShapeExist = True
    Set tempShape = Nothing
    Exit Function
ERROR:
    ShapeExist = False
End Function


Тогда в текстк основной программы, проверка делается проще простого, например:

Sub Main()
    If ShapeExist(ActivePage, "LINE1") Then
        MsgBox "EXIST"
    Else
        MsgBox "NOTHING"
    End If
End Sub

Edited by - ESV on 08/18/2008 17:46:55
Go to Top of Page
  Previous Topic Topic Next Topic  
Данный сайт является архивом форума visio.artberg.ru, который был закрыт в связи с переходом на новую платформу visio.getbb.ru
Все материалы доступны только для чтения! Если у вас появились вопросы, или вы хотите что-то обсудить, связанное с Visio, обращайтесь на новый форум!
Архив был создан благодаря совместным усилиям Генадия Туманова @Tumanov (visio.artberg.ru), Александра ака @Surrogate (visio.getbb.ru), и Николая Белых @nbelyh (unmanagedvisio.com)