Модераторы: mihanik
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как найти только что созданный Shape, в ActiveDocument.Shapes? 
:(
    Опции темы
skyboy
Дата 18.6.2007, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 1
Всего: 260



не понимаю, где концептуальная ошибка 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 Но и ответу без ссылки на маны также буду очень благодарен.
PM MAIL   Вверх
bilya
Дата 18.6.2007, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 3.1.2007

Репутация: 1
Всего: 1



А если по имени?
Код

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 - есть такое свойство и т.п.
PM MAIL   Вверх
skyboy
Дата 18.6.2007, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 1
Всего: 260



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

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

ну, ID, как мне кажется, все же поуникальней будет smile а то, получается, если объект создается и ищется в одном макросе, то при двойном выполнении у меня будут два одноименных объекта. А выбирать из коллекции я постоянно буду первый по очереди с этим именем. До остальных и не дойду....
Так, почему сравнение по is не работает?
PM MAIL   Вверх
bilya
Дата 19.6.2007, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 3.1.2007

Репутация: 1
Всего: 1



Вы, наверное, имели ввиду по индексу, а не по 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 

Это сообщение отредактировал(а) bilya - 19.6.2007, 14:39
PM MAIL   Вверх
skyboy
Дата 19.6.2007, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 1
Всего: 260



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

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

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

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

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами



  • Несанкционированная реклама на форуме запрещена
  • Пожалуйста, давайте своим темам осмысленный, информативный заголовок. Вопль "Помогите!" таковым не является.
  • Чем полнее и яснее Вы изложите проблему, тем быстрее мы её решим.
  • Оставляйте свои записи в "Книге отзывов о работе администрации"
  • А вот тут лежит FAQ нашего подраздела


Если Вам понравилась атмосфера форума, заходите к нам чаще!
С уважением mihanik и staruha.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Программирование, связанное с MS Office | Следующая тема »


 




[ Время генерации скрипта: 0.0520 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.