Имя: Пароль:
1C
1С v8
Excel не открывается
0 first_may
 
07.08.11
18:38
Здравствуйте, мой код по занесению данных в Excel:
Попытка
Эксель = ПолучитьCOMОбъект(Шаблон);
Исключение
Эксель.Application.Quit();
Сообщить("Не удалось инициализировать Microsoft Excel");
КонецПопытки;
       
Лист = Эксель.WorkSheets(1);
Лист.Cells(5, 4).Value = "ТЕСТ";
Лист.Application.Visible = Истина;

Но Excel не открывается. Подскажите пожалуйста, что не так написал?
1 zak555
 
07.08.11
18:39
Эксель.Application.Visible = Истина; ???
2 Tatitutu
 
07.08.11
18:39
потому что ....

а где создать новую книгу или открыть имеющуюся ?
3 Tatitutu
 
07.08.11
18:41
Шаблон - у тебя что ?
то что он красным подсвечен, ничего ?
4 first_may
 
07.08.11
18:44
Шаблон - экселевский файл. А как создать книгу? Мне казалось что при Эксель1 = ПолучитьCOMОбъект(Шаблон) - книга уже есть. В отладчике смотрю, что в ячейку (5, 4) слово ПРИВЕТ пишется.
5 Tatitutu
 
07.08.11
18:46
в (0)
Лист.Cells(5, 4).Value = "ТЕСТ";
а в (4)
смотрю, что в ячейку (5, 4) слово ПРИВЕТ пишется.

КЛАСС !
6 Tatitutu
 
07.08.11
18:47
см. (0) и (1) прочувстую разницу
7 first_may
 
07.08.11
18:52
Эксель.Application.Visible = Истина; - писал, все равно Excel не открывается, только на панели задач появляется на мгновение и сразу закрывается.
8 first_may
 
07.08.11
18:54
По поводу ПРИВЕТ извиняюсь, конечно же вижу в ячейке (5, 4) слово ТЕСТ :)
9 Ork
 
07.08.11
19:01
(0)
1. Вот это вот Эксель = ПолучитьCOMОбъект(Шаблон) не может работать никогда.

Тем более без успешной отработки 1. не может работать вот это : Эксель.Application.Quit()
10 first_may
 
07.08.11
19:05
Почему не может работать? Для ворда работает же, вот так использую:

Попытка
Word = ПолучитьCOMОбъект(Шаблон);
Исключение
Word.Application.Quit();
Сообщить("Не удалось инициализировать Microsoft Word");
КонецПопытки;

и этот код точно функционирует. Вот поэтому аналогично и стал делать для экселя, но вот проблема - он не открывается.
11 Ork
 
07.08.11
19:10
(10) Точно. Проверил - работает. И даже объект получает правильный.
12 first_may
 
07.08.11
19:14
Ну а с экселем? Может действительно проблема в книге?
13 first_may
 
07.08.11
19:19
Вот этот вариант работает нормально:
Попытка
Эксель = Новый COMОбъект("Excel.Application");
Исключение
Эксель.Quit();
Сообщить("Не удалось инициализировать Microsoft Excel");
КонецПопытки;
       
Книга = Эксель.WorkBooks.Open(Шаблон);
Лист = Книга.WorkSheets(1);
Лист.Cells(5, 4).Value = "ТЕСТ";
Эксель.Visible = Истина;


По аналогии пишу:
Попытка
Эксель = ПолучитьCOMОбъект(Шаблон);
Исключение
Эксель.Application.Quit();
Сообщить("Не удалось инициализировать Microsoft Excel");
КонецПопытки;
       
Книга = Эксель.Application.Workbooks(1);
Лист = Книга.WorkSheets(1);
Лист.Cells(5, 4).Value = "ТЕСТ";
Эксель.Application.Visible = Истина;

Excel только моргает напанели задач :(.
14 first_may
 
07.08.11
19:20
Но нужен именно второй вариант.
15 zak555
 
07.08.11
19:20
(13) сначала показать, потом извращаться ?
16 first_may
 
07.08.11
19:22
То есть? Что значит показать?
17 first_may
 
07.08.11
19:31
Вроде нашел ответ
18 first_may
 
07.08.11
19:34
Вот код, кому интересно:
Попытка
Эксель = ПолучитьCOMОбъект(Шаблон);
Исключение
Эксель.Application.Quit();
Сообщить("Не удалось инициализировать Microsoft Excel");
КонецПопытки;
       
Книга = Эксель.Application.Workbooks(1);
Лист = Книга.WorkSheets(1);
Лист.Cells(5, 4).Value = "ТЕСТ";
Книга.Windows(1).Visible = Истина;
Эксель.Application.Visible = Истина;

Проблема решилась после добавления предпоследней строки. Всем большое спасибо.
19 Ork
 
07.08.11
19:36
Прописал объявление переменной Эксель в модуле формы вот так :
Перем Эксель;
Процедура КнопкаВыполнитьНажатие(Кнопка)
   Шаблон="D:\Общая\010811.xls";
   Эксель = ПолучитьCOMОбъект(Шаблон);
   Эксель.Application.Visible=Истина;
   хх=1;
КонецПроцедуры

До закрытия формы Эксель виден. Но пустой.
20 first_may
 
07.08.11
19:39
При работе с вордом по аналогичной схеме, то есть
Попытка
Word = ПолучитьCOMОбъект(Шаблон);
Исключение
Word.Application.Quit();
Сообщить("Не удалось инициализировать Microsoft Word");
КонецПопытки;

я делал замену следующим образом:
Попытка
Замена = Word.Content.Find;
Замена.Execute(Шаблон, Ложь, Истина, Ложь, , , Истина, , Ложь, Значение);
Исключение
Сообщить(ОписаниеОшибки());
Word.Application.Quit();
КонецПопытки;

Хорошо бы такую вещь сделать с Excel`ем, подскажите?
21 Ork
 
07.08.11
19:40
+(19) После закрытия формы без принудительного закрытия Экселя он успешно продолжает висеть в процессах. Невидимым.
22 Ork
 
07.08.11
19:43
(20) Запись макроса (поиск и замена) в Экселе дала такие результаты :

   Cells.Replace What:="1234", Replacement:="768", LookAt:=xlPart, _
       SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
       ReplaceFormat:=False
23 Ork
 
07.08.11
19:45
+(22) Почитать в справке по ВБА за Cells.Replace и можно прикручивать к 1Цэ
24 Ork
 
07.08.11
19:51
Все равно остался вопрос : как без проинициализированного объекта Эксель можно вызвать метод его завершения?
Всмысле вот это : Эксель.Application.Quit();
Вполне может статься, что Экселя просто нет на машине и Application.Quit() делать некому.
25 first_may
 
07.08.11
19:57
А мне все таки не понятно как сделать замену? А завершать мне эксель не надо, я в него формирую отчет, а пользователь сам решает что с ним делать.
26 Torquader
 
07.08.11
19:58
А в чём проблема ПолучитьCOMОбъект(ПутьКФайлу) должен создавать Excel, так как файл Excel, то есть это создание не пустого объекта Excel, а объекта сразу с книгой.
Далее, если мы хотим сделать его видимым, то мы делаем Visible=True, но в этом случае у нас появляется Excel только на панели задач, так как приложение не активно, а вот нужно ещё активизировать книгу:
Лист.Activate();
Лист.Cells(Ряд,Строка).Activate();
после этого должен быть виден Excel на экране, и если это сделать в начале, то можно видеть, как обработка "читает" данные.
А Excel.Application.Quit() закрывает Excel, причём не только открытый вами документ, но и все документы пользователя, так как Ole-сервер у Excel обычно один на всех.
27 first_may
 
07.08.11
20:02
Согласен, с объектом понятно все. А вот с заменой, вот так писать:
Лист.Cells.Replace(Шаблон, Значение, xlPart, xlByRows, Ложь, Ложь, Ложь);
28 first_may
 
07.08.11
20:06
Во всяком случае, то что мне надо было получилось. Замену написал вот так:
Лист.Cells.Replace(Шаблон, Значение, , , Ложь, Ложь, Ложь);

Спасибо.
29 Ork
 
07.08.11
20:09
(27) Вместо вот этого вот "xlPart, xlByRows" нужно подставить ЗНАЧЕНИЯ экселевских констант.

В данном случае константа xlPart=2. Может еще принимать значение 1, что соответствует Экселевской xlWhole.

xlByRows=1. Может принимать значение 2, что соответствует xlByColumns.
30 Ork
 
07.08.11
20:14
+(29) Смотреть значения экселевских констант можно в ObjectBrowser редактора VBA.