Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Программирование, связанное с MS Office > как найти только что созданный Shape


Автор: skyboy 18.6.2007, 00:58
не понимаю, где концептуальная ошибка smile
создал Shape. ищу сразу же этот объект в ActiveDocument.Shapes путем перебора последнего со сравнением посредством is:
Код

Dim InSide As Shape
Set InSide = ActiveDocument.Shapes.AddShape(msoShapeRectangle, 0, 0, 10, 10)
For I = 1 To ActiveDocument.Shapes.Count
If InSide Is ActiveDocument.Shapes(I) Then
Rem строки исключительно для возможности установить breakpoint
ActiveDocument.Close
End If
Next I

Судя по поведению программы(документ не закрывается) и по трассировке(на breakpoint выполнение не заходит), в ActiveDocument.Shapes отсуствует только что созданный Shape.
Точнее - присутсвует, но сравнение равенства не замечает. 
Что я делаю не так?
Только не комментируйте, пожалуйста, "ошибки проектирования". это не более, чем учебный пример.
P.S. Будет лучше, если вместо ответа меня пнут в сторону манов. Ибо охото заодно спросить какой-нить толковый справочник. smile
pps Но и ответу без ссылки на маны также буду очень благодарен.

Автор: bilya 18.6.2007, 12:38
А если по имени?
Код

Public Sub Kvadrat()

Dim iShape As Shape

Set iShape = ActiveDocument.Shapes.AddShape(msoShapeRectangle, 0, 0, 10, 10)

iShape.Name = "MyShape"

For Each Shape In ActiveDocument.Shapes
    If Shape.Name = "MyShape" Then
        ActiveDocument.Close
    End If
Next

End Sub

Вроде работает
IMHO, не стоит для имени переменной употреблять InSide - есть такое свойство и т.п.

Автор: skyboy 18.6.2007, 14:42
Цитата(bilya @  18.6.2007,  11:38 Найти цитируемый пост)
IMHO, не стоит для имени переменной употреблять InSide - есть такое свойство и т.п.

а в VBA существует "неявный" with? ну, когда я не пишу, но интерпретатор неявно обращается к свойствам, скажем, activeDocument? если нет - то какие могут быть проблемы? переименовать-то переменную всегда успею, а вот разобраться с ньюансами работы хотелось бы... 
Цитата(bilya @  18.6.2007,  11:38 Найти цитируемый пост)
А если по имени?

ну, ID, как мне кажется, все же поуникальней будет smile а то, получается, если объект создается и ищется в одном макросе, то при двойном выполнении у меня будут два одноименных объекта. А выбирать из коллекции я постоянно буду первый по очереди с этим именем. До остальных и не дойду....
Так, почему сравнение по is не работает?

Автор: bilya 19.6.2007, 13:11
Вы, наверное, имели ввиду по индексу, а не по ID? Посмотрите это, здесь заодно и ID с его особо уникальным номером  smile 
Код

Public Sub Kvadrat_2()

Dim iShape As Shape

    Set iShape = ActiveDocument.Shapes.AddShape(msoShapeRectangle, 100, 100, 100, 100)

For i = 1 To ActiveDocument.Shapes.Count
    If Not iShape Is Nothing Then
        MsgBox iShape.ID
    End If
    
    If Not ActiveDocument.Shapes(i) Is Nothing Then
        ActiveDocument.Shapes(i).Select
    End If
Next i

End Sub
 smile 

Автор: skyboy 19.6.2007, 23:40
Цитата(bilya @  19.6.2007,  12:11 Найти цитируемый пост)
Вы, наверное, имели ввиду по индексу, а не по ID? 

оп :( только сейчас посмотрел, что такое за свойство ID:
Цитата

Returns the type for the specified object. Read-only Long.

А какое же свойство тогда соответсвует автоинкрементному счетчику, которые позволяет отделить объект от другого? Есть ли такое(гарантированно уникальное для разных объектов) свойство вообще?
P.S. Создателе help'a к VBA убил бы за куцесть их детища и практически полное отсуствие перекресных межстатейных ссылок :(
Может, подскажете "человеческий" справочник?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)