Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 16.01.2009, 14:09   #11
Andru2008
Пользователь
 
Регистрация: 23.12.2008
Сообщений: 17
По умолчанию

Цитата:
Сообщение от viter.alex Посмотреть сообщение
Функция возвращает последнюю созданную фигуру. А дальше делай с ней, что хочешь. Только без извращений
Код:
Function AA() As Shape
 With ActiveSheet.Shapes.BuildFreeform(msoEditingAuto, 112.5, 141.75)
       .AddNodes msoSegmentLine, msoEditingAuto, 207#, 85.5
       .AddNodes msoSegmentLine, msoEditingAuto, 224.25, 150.75
       .AddNodes msoSegmentLine, msoEditingAuto, 130.5, 176.25
       .AddNodes msoSegmentLine, msoEditingAuto, 112.5, 141.75
       .ConvertToShape
       Set AA = ActiveSheet.Shapes.Item(ActiveSheet.Shapes.Count)
   End With
End Function
.......
Ничего подобного. Данная функция фигуру конечно рисует, но при этом еще и показывает фигуру "из 3-х пальцев" возвращая в качестве значения вычисления функции ошибку типа: "#ЗНАЧ!"
Так что ничего кроме извращений с этой фигурой сделать ничего уже нельзя
Andru2008 вне форума
Старый 16.01.2009, 14:20   #12
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

А я думал она тебе только для макроса нужна, а ты еще и в ячейку ставишь! В макросе работает железно.
Попробуй объявить ее как String и результат возвращать так:
Код:
AA = ActiveSheet.Shapes.Item(ActiveSheet.Shapes.Count).Name
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума
Старый 16.01.2009, 14:33   #13
Andru2008
Пользователь
 
Регистрация: 23.12.2008
Сообщений: 17
По умолчанию

Цитата:
Сообщение от viter.alex Посмотреть сообщение
А я думал она тебе только для макроса нужна, а ты еще и в ячейку ставишь! В макросе работает железно.
Попробуй объявить ее как String и результат возвращать так:
Код:
AA = ActiveSheet.Shapes.Item(ActiveSheet.Shapes.Count).Name
Да не в этом проблема. У меня есть прекрасно работающая функция, которая и рисует и имя объекта возвращает:
Код:
Function A() As Variant
  With ActiveSheet.Shapes.BuildFreeform(msoEditingAuto, 112.5, 141.75)
        .AddNodes msoSegmentLine, msoEditingAuto, 207#, 85.5
        .AddNodes msoSegmentLine, msoEditingAuto, 224.25, 150.75
        .AddNodes msoSegmentLine, msoEditingAuto, 130.5, 176.25
        .AddNodes msoSegmentLine, msoEditingAuto, 112.5, 141.75
        A = .ConvertToShape.Name
    End With
End Function
Мне надо, чтобы функция (или эта же самая при рекурсивном вызове или иная умела удалять объект с данным именем), т.е. нужен код типа:
Код:
For Each shp In ThisWorkbook.Worksheets("1").Shapes
      If shp.Name = A Then shp.Delete
    Next
Поэтому например такая отладочная функция:
Код:
Function A() As Variant
  With ActiveSheet.Shapes.BuildFreeform(msoEditingAuto, 112.5, 141.75)
        .AddNodes msoSegmentLine, msoEditingAuto, 207#, 85.5
        .AddNodes msoSegmentLine, msoEditingAuto, 224.25, 150.75
        .AddNodes msoSegmentLine, msoEditingAuto, 130.5, 176.25
        .AddNodes msoSegmentLine, msoEditingAuto, 112.5, 141.75
        A = .ConvertToShape.Name
    End With
   For Each shp In ThisWorkbook.Worksheets("1").Shapes
      If shp.Name = A Then shp.Delete
    Next
End Function
прекрасно работает - и рисует, и имя возвращает и удаляет.
Просто я спрашиваю как проще удалять БЕЗ ПЕРЕБОРА ВСЕХ ГРАФ. ЭЛЕМЕНТОВ ЛИСТА (это я о последних 3-х строчках функции говорю), а сразу именно данный конкретный объект с уже известным именем.
Можно конечно и так как написано (с перебором), но это уже как то очень извращенно (только ресурсы жрать будет). Как напрямую (адресно) это сделать?
Andru2008 вне форума
Старый 16.01.2009, 14:48   #14
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Просто я спрашиваю как проще удалять БЕЗ ПЕРЕБОРА ВСЕХ ГРАФ. ЭЛЕМЕНТОВ ЛИСТА (это я о последних 3-х строчках функции говорю), а сразу именно данный конкретный объект с уже известным именем.
А в чём, собственно, проблема?

Разве вот так не работает? (проверено в Excel 2003)
Код:
Sub Макрос1()
    sh1 = ActiveSheet.Shapes.AddShape(msoShapeRectangle, 194.25, 81#, 115.5, 60.75).Name
    sh2 = ActiveSheet.Shapes.AddShape(msoShapeOval, 268.5, 187.5, 60.75, 78#).Name
    
    ActiveSheet.Shapes(sh1).Delete
    ActiveSheet.Shapes(sh2).Delete
End Sub
EducatedFool вне форума
Старый 16.01.2009, 14:59   #15
Andru2008
Пользователь
 
Регистрация: 23.12.2008
Сообщений: 17
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
А в чём, собственно, проблема?
Разве вот так не работает? (проверено в Excel 2003)
Код:
Sub Макрос1()
    sh1 = ActiveSheet.Shapes.AddShape(msoShapeRectangle, 194.25, 81#, 115.5, 60.75).Name
    sh2 = ActiveSheet.Shapes.AddShape(msoShapeOval, 268.5, 187.5, 60.75, 78#).Name    
    ActiveSheet.Shapes(sh1).Delete
    ActiveSheet.Shapes(sh2).Delete
End Sub
Ха, ха А до такого тут уже на 2-х страницах никто и не додумался.
Как просто. Я сделал еще проще:
Код:
Function AA() As Variant
   With ActiveSheet.Shapes.BuildFreeform(msoEditingAuto, 112.5, 141.75)
        .AddNodes msoSegmentLine, msoEditingAuto, 207#, 85.5
        .AddNodes msoSegmentLine, msoEditingAuto, 224.25, 150.75
        .AddNodes msoSegmentLine, msoEditingAuto, 130.5, 176.25
        .AddNodes msoSegmentLine, msoEditingAuto, 112.5, 141.75
        AA = .ConvertToShape.Name
    End With
    ActiveSheet.Shapes(AA).Delete
End Function
А то мне не нравилось именно такое решение по удалению:
Код:
For Each shp In ThisWorkbook.Worksheets("1").Shapes
      If shp.Name = AA Then shp.Delete
Next
А сейчас все хорошо. Большое спасибо.

Последний раз редактировалось Andru2008; 16.01.2009 в 15:03.
Andru2008 вне форума
Старый 16.01.2009, 15:14   #16
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Ха, ха А до такого тут уже на 2-х страницах никто и не додумался.
Читаем внимательно этот пост

Цитата:
Код:
Sub ajkj()
  Dim sh As Variant
  Set sh = AA
 ActiveSheet.Shapes(sh.Name).Delete
End Sub
По Вашему, этот код работает как-то иначе?
EducatedFool вне форума
Старый 16.01.2009, 15:26   #17
Andru2008
Пользователь
 
Регистрация: 23.12.2008
Сообщений: 17
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Читаем внимательно этот пост
По Вашему, этот код работает как-то иначе?
Конечно иначе. Если в функции (как мне надо), то возвращается ошибка и ничего не удаляется:
Код:
Function AA() As Variant
   With ActiveSheet.Shapes.BuildFreeform(msoEditingAuto, 112.5, 141.75)
        .AddNodes msoSegmentLine, msoEditingAuto, 207#, 85.5
        .AddNodes msoSegmentLine, msoEditingAuto, 224.25, 150.75
        .AddNodes msoSegmentLine, msoEditingAuto, 130.5, 176.25
        .AddNodes msoSegmentLine, msoEditingAuto, 112.5, 141.75
        AA = .ConvertToShape.Name
    End With
     Dim sh As Variant
     Set sh = AA
     ActiveSheet.Shapes(sh.Name).Delete
End Function
Так и длинее и все равно не работает - в отличии от:
Код:
Function AA() As Variant
   With ActiveSheet.Shapes.BuildFreeform(msoEditingAuto, 112.5, 141.75)
        .AddNodes msoSegmentLine, msoEditingAuto, 207#, 85.5
        .AddNodes msoSegmentLine, msoEditingAuto, 224.25, 150.75
        .AddNodes msoSegmentLine, msoEditingAuto, 130.5, 176.25
        .AddNodes msoSegmentLine, msoEditingAuto, 112.5, 141.75
        AA = .ConvertToShape.Name
    End With
    ActiveSheet.Shapes(AA).Delete
End Function
Я то ведь задавал вопрос по КОНКРЕТНОМУ ПРИМЕРУ ФУНКЦИИ и спрашивал КАКИЕ ОПЕРАТОРЫ И КАК ВСТАВИТЬ В ДАННОМ КОНКРЕТНОМ УЧАСТКЕ КОДА после оператора End With........

Последний раз редактировалось Andru2008; 16.01.2009 в 15:29.
Andru2008 вне форума
Старый 16.01.2009, 15:39   #18
Andru2008
Пользователь
 
Регистрация: 23.12.2008
Сообщений: 17
По умолчанию

Еще уточню.
Меня всего лишь интересовал вопрос почему в функции:
Код:
Function A() As Variant
  With ActiveSheet.Shapes.BuildFreeform(msoEditingAuto, 112.5, 141.75)
        .AddNodes msoSegmentLine, msoEditingAuto, 207#, 85.5
        .AddNodes msoSegmentLine, msoEditingAuto, 224.25, 150.75
        .AddNodes msoSegmentLine, msoEditingAuto, 130.5, 176.25
        .AddNodes msoSegmentLine, msoEditingAuto, 112.5, 141.75
        A=.ConvertToShape.Name
    End With
    ActiveSheet.Shapes.SelectAll (точнее не All, а что то типа Select.Name)l 
    Selection.Delete
End Function
не работает участок кода "Selection.Delete" и на какой код его заменить. Всего лишь это меня интересовало и не более. Все очень конкретно - поэтому и хотелось столь же короткого и конкретного ответа.
Но все равно всем большое спасибо за помощь. Извините если что не так. Я не профи, а только учусь и поэтому хочется простых и прямых ответов.

Последний раз редактировалось Andru2008; 16.01.2009 в 15:42.
Andru2008 вне форума
Старый 16.01.2009, 18:23   #19
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию Семен Семеныч!!!!!!!!!!!!!

Нашел в справке. Выбираем все, а затем из выбранного удаляем нужную фигуру. Только выбор потом нужно снять . В Word'e это Selection.Collapse, но в Excel не работает.
Код:
Function A() As Variant
  With ActiveSheet.Shapes.BuildFreeform(msoEditingAuto, 112.5, 141.75)
        .AddNodes msoSegmentLine, msoEditingAuto, 207#, 85.5
        .AddNodes msoSegmentLine, msoEditingAuto, 224.25, 150.75
        .AddNodes msoSegmentLine, msoEditingAuto, 130.5, 176.25
        .AddNodes msoSegmentLine, msoEditingAuto, 112.5, 141.75
        A = .ConvertToShape.Name
    End With
        ActiveSheet.Shapes.SelectAll
        Selection.ShapeRange(A).Delete
End Function
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
почему не работает domovoi Общие вопросы Delphi 1 15.10.2008 18:42
Почему не работает цикл????? Marsik Помощь студентам 2 22.06.2008 14:16
Breakpoints напритив delete[] не работает - Visual C++ v8.00 Игорь007 Помощь студентам 9 03.06.2008 00:50
Почему не работает код? Kashp Общие вопросы Delphi 3 09.08.2007 17:33