Имя: Пароль:
1C
 
Как удалить лист Excel через OLE ?
0 kg2
 
21.11.04
20:32
КолЛистов = Эксель.Worksheets.Count;
   Для Инд = 2 По КолЛистов Цикл //удаляем все листы, кроме первого
           <?????????????>
   КонецЦикла;
1 miki
 
21.11.04
20:35
(0)Зачем тебе ЭТО???
2 miki
 
21.11.04
20:41
Вот тебе из help'a VBA:
Worksheets("Sheet3").Delete
3 kg2
 
21.11.04
20:47
Есть бланки заказа в формате Excel с одинаковой структурой, но заполненные разными данными. Формируются из 1С. Первый лист - прайс, остальные - списки товаров(каждый лист - это содержимое 1-ой группы справочника номенклатуры).
Покупатель заполняет, сколько и какого товара он хочет купить. Структура первого листа всегда одинакова(сложная). Задумка в том, чтобы новый бланк заказа формировался на основании любого из старых.
4 kg2
 
21.11.04
20:49
(2)Я это видел, мне нужно по индексу.
  Эксель.WorkSheets(Инд).Delete и подобные варианты не прокатывают
5 miki
 
21.11.04
21:01
Странно, что (4) не прокатывает. Попробуй так:
  Sheets("Лист3").Select
  ххх.SelectedSheets.Delete
Или
  Range("B21").Select
  ххх.SelectedSheets.Delete
Или через квадратные скобки, свойство count и т. п. Ща тоже поробую, если что - отпишусь.
6 427
 
21.11.04
21:05
Делал, но не так...
Все заполняется из 1С

Файл Экселя - заказ...
Первый лист - титул.
Там выводится - клиент, доп данные, контактные телефоны и сслыки на другие листы (сумма по данному заказу) + всякая дребедень..
Следующие листы - по группам первого уровня (по факту - до 20 листов).
Прайс в виде дерева.
товар, единица измерения, цена за единицу. Поле Заказ - доступно клиенту. Сразу же клиент видит сумму по строке.
В Шапке листа (программно закреплена страница) сразу же выводится сумма по листу и всему заказу.
Листы - закрыты от изменений, доступно только поле ввода - ЗАКАЗ...

Клиент просто заполняет ЗАКАЗ, видит при этом сумму, если согласен - отсылает правленый файл назад.

Он программно обрабатывается, и на все, что есть в наличии, просто выписывается РН и проводится. Остальное (те позиции, где ЗАКАЗ ненулевой) -  в заявку покупателя...

Был общий прайс - формировался один раз и рассылался обычным клиентам...
И были индивидуальные заказы - прайс с индивидуальными скидками клиенту...

Формирование и отправка шли на автопилоте ночью - примерно 1 час...

Формирование и отправка индивидуальных прайсов (каждый прайс - примерно 40 секунд), днем в полуручном режиме... Индивидуальных клиентов было сотни 3, прайсы им отсылались по запросу, примерно 30 в день... Заказов возвращалось в среднем штук 10-15...

Количество товарных позиций (по остаткам) 5-8 тыс...
Строк в формируемом прайсе было до 15 тыс (группы, пустые строки, итоговые по группам) и т.д.

Так что проще сформировать первый лист по новой...Чем удалять старые...
7 miki
 
21.11.04
21:21
(4) Пошукал я тут... Пробуй Эксель.WorkSheets[Инд].Delete.
(Скобки - квадратные)
8 miki
 
21.11.04
21:23
(7)На еще:
Worksheets.Item(1)
9 miki
 
21.11.04
21:36
(8) + Люди еще в комплекте юзают "DisplayAlerts":
Application.DisplayAlerts=0;//не выдавать предупреждений
Пока WorkBook.Worksheets.Count>1 Цикл
WorkBook.Worksheets(1).Delete();
КонецЦикла;
Application.DisplayAlerts=-1;//восстановление флага выдачи предупреждений
Видел у разных челов. Наверное, не спроста.
10 kg2
 
21.11.04
21:54
(7)Эксель.WorkSheets<<?>>[Инд].Delete;
{(11)}: Неопознанный оператор
При проверке модуля обнаружены синтаксические ошибки!

...так при квадратных скобках (пробовал и Delete())

(8)РабочаяКнига.Worksheets(Инд).Delete();        
{D:\1CBASES\ВЕРЕКО\EXTFORMS\ВЫГРУЗКАПРАЙСА.ERT(13)}: :

...а так при круглых при открытии(пробовал и Эксель.Worksheets(Инд).Delete())

Я уже сто вариантов перепробовал.
11 База Данных
 
21.11.04
21:57
Напиши код в VB в екселе.
Если эксель не знаешь, напиши макрос автоматом.
Потом http://www.snif.ru/pages/vba.htm
12 miki
 
21.11.04
22:05
(11) Макрос автоматом пишет (5).
Пробуй так:
Worksheets.Item[1]
13 miki
 
21.11.04
22:08
(12)+ Не все методы, доступные в интерактивном режиме доступны через ОЛЕ/КОМ. Или вызываются иначе. Также имеет место быть несовместимость версий.
14 База Данных
 
21.11.04
22:10
Worksheets("Sheet3").Delete

перевелось как

Excel = СоздатьОбъект("Excel.Application");
Excel.Displayalerts = 0;//отключить встроенные предупреждения Excel
Excel.Workbooks.Add();//Создать новую книгу
Excel.Worksheets
Excel.Visible = 1;//1 - открыть приложение

получается
Эксель.Worksheets("Sheet3").Delete();
15 miki
 
21.11.04
22:11
Вот как чел бился с этим в дельфях:
ExcelWorkSheet.ConnectTo(ExcelApplication.ActiveWorkbook.Worksheets[1] as Excel97.ExcelWorksheet);
ExcelWorkSheet.Delete;
Т. е. можешь попытаться сделать нужный лист активным (текущим), а потом:
ExcelWorkSheet.Delete
16 kg2
 
21.11.04
22:54
Для Инд = 2 По КолЛистов Цикл //удаляем все листы, кроме первого  
       Имя = Эксель.Sheets(Инд).Name;  
       Эксель.Worksheets(Имя).Delete();
   КонецЦикла;    

Если добавить в цикл Сообщить(Имя), то сообщает правильно,
если вместо Эксель.Worksheets(Имя).Delete(); написать
           Эксель.Worksheets("Лист2").Delete() то нужный лист удаляется
Но, бл..., если оставить так, то пишет :"
Им = Эксель.Sheets(Инд).Name;  
{D:\1CBASES\ВЕРЕКО\EXTFORMS\ВЫГРУЗКАПРАЙСА.ERT(11)}: :"
В чем может быть дело ?
17 miki
 
21.11.04
22:59
(16)О. Что вижу? "Эксель.Sheets(Инд)". Работает?
Попробуй Эксель.Sheets(Инд).Delete.
18 kg2
 
21.11.04
23:05
(17)
1."Эксель.Sheets(Инд).Delete();  
{D:\1CBASES\ВЕРЕКО\EXTFORMS\ВЫГРУЗКАПРАЙСА.ERT(11)}: : "
2."Эксель.Sheets(Инд).Delete<<?>>;  
{(11)}: Неопознанный оператор
При проверке модуля обнаружены синтаксические ошибки!"
19 miki
 
21.11.04
23:19
Ну, хз. Попробуй Эксель.Sheets[Инд].Delete.
.Worksheets.Item[Инд] пробывал?
20 kg2
 
21.11.04
23:27
Всё пробывал. Ни чё не помагает. Всё, пошёл вешаться !
21 miki
 
21.11.04
23:33
(20) Я тоже иссяк. Может все-таки трабла в Displayalerts?
PS. Попробуй в (16) TrimAll(Имя).
22 База Данных
 
21.11.04
23:35
Напиши этот цикл в макросе. И, давай сюда. Я попробую тебе его сконвертировать.
23 kg22
 
22.11.04
12:20
Вот пример, который должен работать

   Эксель = СоздатьОбъект("Excel.Application");
   РабочиеКниги = Эксель.WorkBooks;
   РабочаяКнига = РабочиеКниги.Open(ИмяФайла,0,0);    
   //Эксель.DisplayAlerts = 0;
   КолЛистов = Эксель.Worksheets.Count;
   Для Инд = 2 По КолЛистов Цикл //удаляем все листы, кроме первого  
       Эксель.Sheets(Инд).Delete();
   КонецЦикла;    
   //Эксель.DisplayAlerts = -1;    
   Эксель.Visible = 1;

но выдаёт ошибку "Эксель.Sheets(Инд).Delete();
{D:\...\EXTFORMS\ВЫГРУЗКАПРАЙСА.ERT(13)}: Microsoft Excel: Метод Delete из класса Worksheet завершен неверно". Объясните, что не так, люди добрые !
24 Бивень
 
22.11.04
12:47
Прикольно ...
23 поста и на детскую ошибку никто не показал ...
25 Бивень
 
22.11.04
12:51
Пока Эксель.Worksheets.Count>1 Цикл //удаляем все листы, кроме первого  
 Эксель.Sheets(2).Delete();
КонецЦикла;
26 427
 
22.11.04
13:07
.



(25) А зачем? Прикольно ж наблюдать...





.
27 Бивень
 
22.11.04
13:22
(26) Пардон, несдержался, уж больно сильно выпендриться захотелось :((
28 kg22
 
22.11.04
13:25
(25,26)"Эксель.Sheets(2).Delete();
{D:\...\EXTFORMS\ВЫГРУЗКАПРАЙСА.ERT(11)}: Microsoft Excel: Метод Delete из класса Worksheet завершен неверно"
Так в чем ошибочка-то умные дяденьки, ну объясните пожалуйста.
29 Прикольно
 
22.11.04
13:29
наблюдать какой Бивень взрослый, а 427 наблЮдательный
30 Бивень
 
22.11.04
13:57
(28) А давай ты свой вопрос поширше развернёшь.
Я уже догадываюсь, в чем твоя ошибка (кстати, опять же детская), но вдруг я ошибаюсь.
(29) Тьфу на тебя!
31 Тьфу
 
22.11.04
14:05
на оба ваших (24),(26) дома.
32 kg22
 
22.11.04
14:20
(30)
   Эксель = СоздатьОбъект("Excel.Application");
   РабочиеКниги = Эксель.WorkBooks;
   РабочаяКнига = РабочиеКниги.Open(ИмяФайла,0,0);    
   //Эксель.DisplayAlerts = 0;
   Пока Эксель.Worksheets.Count Цикл //удаляем все листы, кроме первого  
       Эксель.Sheets(2).Delete();
   КонецЦикла;    
   //Эксель.DisplayAlerts = -1;    
   Эксель.Visible = 1;

Всё, заработало ! У меня файл .xls глючный какой-то был оказывается -
ошибку, как в (23) выдавал (видимо в экселе - настройки). На другом файле
- пашет. В (16) действительно детская ошибка - не выспался !
Всем спасибо !
Тема закрыта.
33 Сдается
 
22.11.04
14:32
мне у тебя файл екселя оставался не закрытым после вылета 1С при неправильном методе Delete. Из-за этого, были траблы уже и при правильном коде.