![]() |
|
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.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |