![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу. Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста". Название темы слишком короткое или не отражает сути вашего вопроса. Тема исчерпала себя, помните, один вопрос - одна тема Прочитайте правила и заново правильно создайте тему. |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 23.12.2008
Сообщений: 17
|
![]()
У меня не получается следующее:
1. Есть несколько программных блоков по созданию графических объектов с использованием группировки, например: 'Блок1: With ActiveSheet.Shapes.BuildFreeform(ms oEditingAuto, 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.Select End With ' Блок2: With ActiveSheet.Shapes.BuildFreeform(ms oEditingAuto, 189.75, 408#) .AddNodes msoSegmentCurve, msoEditingAuto, 266.25, 333# .AddNodes msoSegmentCurve, msoEditingAuto, 213#, 283.5 .AddNodes msoSegmentCurve, msoEditingAuto, 189.75, 408# .ConvertToShape.Select End With 2. Таких блоков может быть произвольное количество и они могут описывать разные графические подэлементы. 3. Требуется объединить эти уже по отдельности сгруппированные объекты в один, но с сохранением уже созданных группировок (группировка второго уровня) - чтобы можно было применять локальные атрибуты к отдельным подэлементам (разный цвет, толщина линий и т.д). Это нужно сделать не методом выделения мышкой их на листе и ручной группировкой, а именно программно. При этом не требуется их искать на листе, а нужно всего лишь написать программу типа: Блок1-N: Блок1: .............. End Блок1 Блок2: .............. End Блок2 ............ БлокN: .............. End БлокN End Блок1-N Заранее спасибо за помощь. |
![]() |
![]() |
#2 |
Программист VBA
СуперМодератор
Регистрация: 13.07.2008
Сообщений: 6,858
|
![]() Код:
В массив arr записываются имена фигур. Поскольку метод .ConvertToShape возвращает объект типа Shape, а выделять этот объект в принцепе не требуется, то я заменил все строки .ConvertToShape.Select на строки ReDim Preserve arr(1 To UBound(arr) + 1): arr(UBound(arr) - 1) = .ConvertToShape.Name |
![]() |
![]() |
#3 |
Пользователь
Регистрация: 23.12.2008
Сообщений: 17
|
![]()
Вот спасибо.
Попробую. |
![]() |
![]() |
#4 |
Пользователь
Регистрация: 23.12.2008
Сообщений: 17
|
![]()
Еще раз спасибо за помощь.
Разобрался. Все работает. Точнее ПОЧТИ все работает. Я так понял, что код: ActiveSheet.Shapes.SelectAll: Selection.Delete должен был бы выделять на листе все графические элементы уже ранее созданные и удалять их, но это не срабатывает - не выделяет и не удаляет. сам участок кода: ActiveSheet.Shapes.SelectAll я применяю в другом месте (в другой функции) он там у меня действительно выделяет все элементы (в вашем варианте он не работает вообще, хотя почему - не понимаю), но вот Selection.Delete не работает - хоть убей (ни в вашем варианте, ни во всех моих попытках). Почему это так? |
![]() |
![]() |
#5 | ||
Программист VBA
СуперМодератор
Регистрация: 13.07.2008
Сообщений: 6,858
|
![]() Цитата:
Попробуйте воспользоваться макрорекордером, если у Вас другая версия Excel. (выделите несколько фигур, и удалите их) В моём случае макрорекордер пишет вот что: Код:
Цитата:
Лучше всегда ссылаться на конкретный лист, потому что активным в процессе выполнения может стать любой лист (если макрос большой, можно и забыть, что где-то была команда активации другого листа) Лучше использовать такую конструкцию: Код:
|
||
![]() |
![]() |
#6 |
Старожил
Регистрация: 05.12.2007
Сообщений: 4,180
|
![]()
Вместо
Код:
Код:
Чем шире угол зрения, тем он тупее.
|
![]() |
![]() |
#7 |
Пользователь
Регистрация: 23.12.2008
Сообщений: 17
|
![]()
Понимаете в чем хитрость:
1. Я открыл новую книгу и "тупо" взял весь предложенный во 2-м посту код и вставил в тело функции (без каких либо изменений) - все работает кроме ActiveSheet.Shapes.SelectAll: Selection.Delete 2. Я удивился и упростил эту функцию таким образом: Код:
3. Я добавил еще одну функцию: Код:
Вопрос: Почему выделенный элемент (в функции В) все равно не удаляется при помощи Selection.Delete? Ведь он же выделился, но .... Я просто дурею..... Тут уже вопрос не столько как можно иначе, сколько НУ ПОЧЕМУ ТАК? Последний раз редактировалось Andru2008; 27.12.2008 в 00:00. |
![]() |
![]() |
#8 | |
Пользователь
Регистрация: 23.12.2008
Сообщений: 17
|
![]() Цитата:
Ну а в функции (как мне надо - не макросом, а через вызов функции) - об особенностях этого я написал выше. Последний раз редактировалось Andru2008; 26.12.2008 в 23:41. |
|
![]() |
![]() |
#9 | |
Пользователь
Регистрация: 23.12.2008
Сообщений: 17
|
![]() Цитата:
Код:
![]() |
|
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
группировка | Мингиян | Microsoft Office Excel | 2 | 23.04.2008 23:43 |
Группировка | SveSve | Microsoft Office Excel | 3 | 21.03.2008 11:50 |
Автоматическая группировка | buk | Microsoft Office Excel | 5 | 20.09.2007 13:35 |
Группировка по окончанию строки | Remein | Microsoft Office Excel | 2 | 13.09.2007 11:39 |
Группировка в QReport или в RaveReports | Paul Hindenburg | БД в Delphi | 1 | 24.08.2007 14:24 |