Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Удаление картинки из листа Excel [D7, WinXP]


Антоныч ©   (2006-10-25 16:53:00) 

Всем добрый день. Постоянно пишу программы на Delphi для работы с базами данных, все отчёты оформляю в Excel. И удобно, и заказчики довольны. Если возникают трудности, то действовую стандартно: записываю макрос в Excel, затем пишу то же самое в своей программе. Но сегодня возникли трудности. При определённых условиях потребовалось удалять из отчёта небольшую картинку. Сделал макрос в Excel:
ActiveSheet.Shapes("Pozhar").Delete
перенёс в Delphi:
var
 XLApp, WorkBk, WorkSheet: Variant;
....
 XLApp:=CreateOLEObject('Excel.Application');
 WorkBk:=XLApp.WorkBooks.Open(FileName);
 WorkSheet:=WorkBk.Sheets[1];
 ...
 WorkSheet.Shapes['Pozhar'].Delete

На последней строчке выскакивает ошибка "Член группы не найден". Стал пробовать по-другому, попробовал получить доступ к коллекции Shapes по индексу:
 WorkSheet.Shapes[1].Delete
или
 WorkSheet.Shapes.Item[1].Delete (что, в принципе, одно и то же)  - всё таже ошибка. Единственное, что "схавал" Excel - это вернул общее количество картинок на листе через
 kol:=Worksheet.Shapes.Count
 и выделил их все:
 Worksheet.Shapes.SelectAll
 Выкрутился тем, что для удаления картинки запускаю макрос, но вопрос по-прежнему остался открытым: Почему не работает напрямую?


MetalFan   (2006-10-26 16:48:00) [1]

count проверяй... на всякий случай


Антоныч   (2006-10-26 16:31:00) [2]

MetalFan:Спасибо, помогло.
Однако вопрос всё-равно остался открытым. Например, Sheets - это тоже коллекция в Excel (так написано в help-e), и доступ осуществляется через квадратные скобки (см. как у меня выше). Только что попробовал написать
WorkSheet:=WorkBk.Sheets.Item(1)
Вылетела та же ошибка: "Член группы не найден".

Shirson:В том же help-е написано, что свойство Item является у большинстваколлекций используемым по-умолчанию, поэтому можно обращаться как через Item, так и без него (по типу TList в Delphi). Например, как коллекция Sheets. Такое ощущение, что к Shapes в данном случае слово "большинство" не относится :-)


Shirson   (2006-10-26 11:14:00) [3]

Антоныч, просто нужно помнить что в отличии от Delphi, в екселевском VBA, доступ к членам коллекций осуществляется только через .item() и только с круглыми скобками.


MetalFan   (2006-10-25 20:02:00) [4]

у меня вот что прокатило:
var
XLApp, WorkBk, WorkSheet, Shp: Variant;
begin
...
XLApp := GetActiveOleObject('Excel.Application');
WorkBk := XLApp.Workbooks[1];
WorkSheet:=XLApp.ActiveSheet;
Shp := WorkSheet.Shapes.Item(1);
Shp.Delete;
...


MetalFan   (2006-10-25 19:34:00) [5]

у меня эксель на удаление такой код придложил
ActiveSheet.Shapes("Picture 1").Select
Selection.Delete

попробуй - может прокатит?


Наверх

Титульная страница Поиск, карта сайта Написать письмо