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

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

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

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

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

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

Народ! Объясните мне, темному , почему такая простая конструкция у меня не работает?
Код:
Function A() As Variant
 Dim sh As Worksheet
 Set sh = ThisWorkbook.Worksheets("1")
 sh.Shapes.SelectAll
 Selection.Delete
 A= 1
End Function
Точнее работает все кроме Selection.Delete. При этом все графические объекты данной функцией на листе находятся и выделяются, но выделенный объект командой Selection.Delete (которая стоит сразу после команды выделения) не удаляется.
При этом, при выходе из функции на листе оказываются выделенными все графические элементы, функция нормально завершается с выдачей идентификатора завершения (в ячейке вызова функции возвращается значение "1"), но Selection.Delete не срабатывает.
Почему так? В чем ошибка?
Andru2008 вне форума
Старый 09.01.2009, 12:13   #2
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

у Shapes нет метода Delete. у Shape - есть. Пробуйте так:

For Each shp In ThisWorkbook.Worksheets("1").Shapes
shp.Delete
Next
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума
Старый 16.01.2009, 12:04   #3
Andru2008
Пользователь
 
Регистрация: 23.12.2008
Сообщений: 17
По умолчанию

Спасибо за ответ.
Так то работает, но мне надо несколько иное. Я это уже обсуждал в разделе "Программная группировка графики", но в предложенном мне решении работало все, кроме удаления и мне там так и не пояснили почему. Поэтому в данном разделе я упростил вопрос. Видимо зря.
Привожу полный фрагмент. Есть функция, которая рисует графику (по входным параметрам) и должна удалить ранее нарисованные ею объекты (не все, а именно данные объекты).
Реализация создания массива имен рисованных объктов для удаления уже выяснена. Надо просто по этим данным удалить данные объекты.
Ну чтобы упростить - давайте сразу в одном проходе (без передачи параметров в функцию), а просто - рисуем, запоминаем имена и сразу все это и удаляем. НО ТОЛЬКО ЭТО, А НЕ ВСЮ ГРАФИКУ ЛИСТА. Например где то так (только надо не SelectAll, а именно что то типа Select.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
    ActiveSheet.Shapes.SelectAll: Selection.Delete
End Function
И еще, по поводу вашего замечания, что "у Shapes нет метода Delete. у Shape - есть."
Почему же тогда мой макрорекордер при ручном рисовании-удалении создает такой код:
Код:
Sub Макрос1()
    ActiveSheet.Shapes.Range(Array("Rectangle 1", "Oval 2", "Line 3")).Select
    Selection.Delete
End Sub
И ОН РАБОТАЕТ....... Тот же "Shapes" тот же "Selection.Delete" и все нормально, а у меня нет..... Почему?

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

Цитата:
Сообщение от IgorGO Посмотреть сообщение
у Shapes нет метода Delete. у Shape - есть. Пробуйте так:

For Each shp In ThisWorkbook.Worksheets("1").Shapes
shp.Delete
Next
Спасибо за ответ.
Так то работает, но мне надо несколько иное. Не всю графику листа удалять, а именно конкретную.
Andru2008 вне форума
Старый 16.01.2009, 12:32   #5
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Цитата:
Сообщение от Andru2008 Посмотреть сообщение
Ну чтобы упростить - давайте сразу в одном проходе (без передачи параметров в функцию), а просто - рисуем, запоминаем имена и сразу все это и удаляем. НО ТОЛЬКО ЭТО, А НЕ ВСЮ ГРАФИКУ ЛИСТА.
Этот пост показывает как это делать. Там правда, фигуры распознаются по ID, таблицы, к которой они привязаны, но это мелочь. Смотреть нужно 8 строку снизу в коде.

Цитата:
Сообщение от Andru2008 Посмотреть сообщение
И еще, по поводу вашего замечания, что "у Shapes нет метода Delete. у Shape - есть."
Почему же тогда мой макрорекордер при ручном рисовании-удалении создает такой код:
Код:
Sub Макрос1()
    ActiveSheet.Shapes.Range(Array("Rectangle 1", "Oval 2", "Line 3")).Select
    Selection.Delete
End Sub
И ОН РАБОТАЕТ....... Тот же "Shapes" тот же "Selection.Delete" и все нормально, а у меня нет..... Почему?
У Shapes действительно нет метода Delete. И в этом примере он тоже не используется. А вот у Shapes.Range(массив с фигурами), который выделяется, а потом удаляется, такой метод есть.
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума
Старый 16.01.2009, 12:38   #6
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Если вы знаете как отличить подлежащие удалению обьекты от остальных - добавьте проверку на наличие необходимого признака:
For Each shp In ThisWorkbook.Worksheets("1").Shapes
if shp ... then shp.Delete
Next
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума
Старый 16.01.2009, 13:05   #7
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
    For Each shp In ThisWorkbook.Worksheets("1").Shapes
      If shp.Name = A Then shp.Delete
    Next
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
    ActiveSheet.Shapes.Range(Array(A)).Select
    Selection.Delete
Правда в данном случае как раз и не удаляется....
Хотя если нельзя без перебора, то и так как получилось меня тоже устраивает. Еще раз всем спасибо.
Andru2008 вне форума
Старый 16.01.2009, 13:09   #8
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Цитата:
Сообщение от Andru2008 Посмотреть сообщение
… Применить что то типа:
Код:
   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.Range(Array(A)).Select
    Selection.Delete
Правда в данном случае как раз и не удаляется....
Хотя если нельзя без перебора, то и так как получилось меня тоже устраивает. Еще раз всем спасибо.
Попробуй так
Код:
A = .ConvertToShape
A.Delete
Ты передаешь функции имя фигуры, а попробуй передай саму фигуру.
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума
Старый 16.01.2009, 13:16   #9
Andru2008
Пользователь
 
Регистрация: 23.12.2008
Сообщений: 17
По умолчанию

Цитата:
Сообщение от viter.alex Посмотреть сообщение
Попробуй так
Код:
A = .ConvertToShape
A.Delete
Ты передаешь функции имя фигуры, а попробуй передай саму фигуру.
Неа.... не пашет. функция
Код:
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
    End With
   AA.Delete
End Function
возвращает ошибку, хотя все и рисует........ да и мне надо, чтобы функция имя возвращала, а уже при следующем вызове, я мог ввести данное имя в функцию как параметр и удалить объект по имени "Х".

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

Функция возвращает последнюю созданную фигуру. А дальше делай с ней, что хочешь. Только без извращений
Код:
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
Sub ajkj()
  Dim sh As Variant
  Set sh = AA
 ActiveSheet.Shapes(sh.Name).Delete
End Sub
Лучше день потерять — потом за пять минут долететь!©
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