|
v7: Excel в MS Office 2010 | ☑ | ||
---|---|---|---|---|
0
olmi
26.06.14
✎
06:16
|
Загружаю Excel таблицу в 1С 7.7
Все работало без проблем с *.xls в старом Excel. Но в MS Office 2010 выдаёт ошибку: Книга.Close(); {Обработка.ЗаполнитьСписокСотрудниковИзExcelДляТабеля.Форма.Модуль(295)}: Неизвестная ошибка Перед этим все определено: Excel = СоздатьОбъект("Excel.Application"); Книги = Excel.Workbooks; Книга=Книги.Open(ФайлТабеля,0,1); и нормально выполнена куча действий в этой книге, например, КолЛистов=Книга.Sheets.Count; и обращение к Функция ПолучитьЗначение(Excel,y,x) Cell=Excel.Cells(y,x); Возврат Cell.Value; КонецФункции К слову, после закрытия книги, которое не получается, идет Excel.Quit(); Будет ли работать этот оператор нормально? |
|||
1
PaulBC
26.06.14
✎
06:28
|
А что в строке №295?
|
|||
2
catena
26.06.14
✎
06:54
|
(0)А если попробовать закрывать то же, что открываем?
КнигИ.Close(); - работает? |
|||
3
olmi
26.06.14
✎
13:17
|
(1) Книга.Close();
{Обработка.ЗаполнитьСписокСотрудниковИзExcelДляТабеля.Форма.Модуль(295)}: Неизвестная ошибка (2) Раньше работало и так.Теперь зависает на (1). Книги.Close(); тоже не работает. Может быть, в последовательности Книга.Close(); Excel.Quit(); оставить только закрытие Excel? |
|||
4
olmi
26.06.14
✎
13:26
|
Даю всю Экселевскую часть обработки:
//****************************************************************************** Функция ПолучитьЗначение(Excel,y,x) Cell=Excel.Cells(y,x); Возврат Cell.Value; КонецФункции //****************************************************************************** Функция ПолучитьТаблицуСотрудников(КодОш) Перем Excel,Страница; Попытка Excel = СоздатьОбъект("Excel.Application"); Исключение Сообщить(ОписаниеОшибки() + " Программа Exсel не установлена на данном компьютере!"); КодОш=1; Возврат ТаблицаСотрудников; КонецПопытки; ... Excel.Visible = 0; Книги = Excel.Workbooks; Попытка Книга=Книги.Open(ФайлТабеля,0,1); Исключение Сообщить("Файл табеля не найден.","!"); КодОш=1; Возврат ТаблицаСотрудников; КонецПопытки; КолЛистов=Книга.Sheets.Count; Если КолЛистов>1 Тогда Листы=СоздатьОбъект("СписокЗначений"); Для НомерЛиста = 1 по КолЛистов Цикл Страница = Excel.Sheets(НомерЛиста); ИмяЛиста = Страница.Name; Листы.ДобавитьЗначение(НомерЛиста, ИмяЛиста); КонецЦикла; ... Иначе НомерЛиста=1; КонецЕсли; Страница = Excel.Sheets(НомерЛиста); ИмяЛиста = Страница.Name; ... Сотрудники=СоздатьОбъект("Справочник.Сотрудники"); Для к=1 По КолСотрудников Цикл ... ТабНомер =СокрЛП(ПолучитьЗначение(Страница,НомерСтр, 25)); ... Сотрудник=Сотрудники.ТекущийЭлемент(); ... ТекстВсегоДней =ПолучитьЗначение(Страница,НомерСтр, 142); ТекстВсегоЧасов =ПолучитьЗначение(Страница,НомерСтр, 148); ТекстВсегоНочных =ПолучитьЗначение(Страница,НомерСтр, 179); ТекстВсегоВыходныхИПраздн1 =ПолучитьЗначение(Страница,НомерСтр, 170); ТекстВсегоВыходныхИПраздн2 =ПолучитьЗначение(Страница,НомерСтр+2, 170); ФИО =ПолучитьЗначение(Страница,НомерСтр, 7); КонецЦикла; //Книга.Close(); Книги.Close(); Excel.Quit(); |
|||
5
olmi
26.06.14
✎
13:28
|
Сыплется на операторе закрытия книги.
|
|||
6
Kookish
26.06.14
✎
13:31
|
А если сделать что-то типа:
db = СоздатьОбъект("ADODB.Connection"); // "HDR=No" - считает первую строку листа данными, а не заголовком. По умолчанию "HDR=Yes" // ConectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + ПутьКФайлу + ";Extended Properties=""Excel 8.0;HDR=No;IMEX=1;"";"; ConectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + ПутьКФайлу + ";Extended Properties=""Excel 12.0 Xml;HDR=No;IMEX=1;"";"; rs=CreateObject("ADODB.Recordset"); db.Open(ConectionString); rs.ActiveConnection = db; rs.CursorType = 3; rs.LockType = 2; // Выбираем все данные с первого листа rs.Source = "Select * from [Лист №1$]"; rs.Open(); // Получаем количество колонок и количество строк КоличествоПолей = rs.Fields.Count; //Сообщить("Количество колонок: " + КоличествоПолей); КоличествоЗаписей = rs.RecordCount; //Сообщить("КоличествоЗаписей: " + КоличествоЗаписей); Заодно и быстрее работать будет... |
|||
7
Kookish
26.06.14
✎
13:32
|
В конце, разумеется:
rs.Close(); db.Close(); |
|||
8
pechevas
26.06.14
✎
13:33
|
Excel.Workbooks.Close();
|
|||
9
pechevas
26.06.14
✎
13:34
|
(6) Это предложение получше, если только в полях данные одинаковые.
|
|||
10
eshtrey
26.06.14
✎
13:34
|
попробуй Страница = Excel.Worksheets(НомерЛиста);
а в конце можно просто Excel = 0 |
|||
11
volodya43234
26.06.14
✎
13:38
|
у меня на связке 2010 екселя и 1с так работает
Excel.ActiveWorkbook.close(); Больше ничего не нужно. |
|||
12
olmi
26.06.14
✎
13:49
|
(8) Не работает.
(9) Что значит-данные одинаковые? Там объединенные ячейки есть, данные, полученные по формулам и т.д. Я тупо выбираю как текст и обрабатываю как мне надо. Все работает до закрытия книги. При старом Excel книга закрывалась. (10) Со страницей проблем нет. (11) Не работает, зависает. ТипЗначенияСтр(Excel.ActiveWorkbook) = "OLE._Workbook". Оператор скопировала отсюда, ошибок в буквовках быть не может. |
|||
13
olmi
26.06.14
✎
13:50
|
Если пропустить этот оператор, Excel не закрывается, на следующем документе, соответственно, не открывается.
|
|||
14
ildary
26.06.14
✎
13:58
|
(6) можно задать вопрос по ADO? как правильно грузить данные, состоящие из длинных чисел? НАпример Ш/К загруженно через ADO превращаются из 4743545345435 в что-то вроде "4,7e+10".
|
|||
15
volodya43234
26.06.14
✎
14:00
|
Конешно не закрывается.
Даю свой рабочий код Попытка ExcelApp = СоздатьОбъект("Excel.Application"); Исключение Сообщить(ОписаниеОшибки()+"; программа Excel не установлена на данном компьютере!"); Возврат; КонецПопытки; РабочиеКниги=ExcelApp.WorkBooks; Попытка РабочаяКнига=РабочиеКниги.Open(ИмяФайла); // РабочаяКнига=РабочиеКниги.ОткрытьФайл(Файл); ОписаниеОшибки(); Исключение ExcelApp.Quit(); Сообщить("Ошибка открытия файла!"); Возврат; КонецПопытки; СКонтр=СоздатьОбъект("Справочник.Контрагенти"); работа с данными екселя. ExcelApp.ActiveWorkbook.close(); |
|||
16
volodya43234
26.06.14
✎
14:33
|
Кстати если документы созданы в 95 екселе (сохранены из 1С), то можно добавить еще такую запись:
ExcelApp.Visible = 0; |
|||
17
volodya43234
26.06.14
✎
14:51
|
(+)замечание.
Во время работы кода с екселем не нужно переключатся на другие открытые книги (или открывать новые). Дождаться пока код отработает. |
|||
18
volodya43234
26.06.14
✎
14:58
|
(12) наконец сообразил что Вы ответили мне в этом сообщении.
Думаю я правильно догадываюсь. "Зависает" именно на коде: ExcelApp.ActiveWorkbook.close(); Причина. Екселевский файл сохранен в 95 екселе. А особенность 2010 екселя в том, что он такой файл предлагает пересохранить, даже если в нем ничего не изменяли. Поэтому висит не код из 1С, а запрос в екселе для сохранения документа. |
|||
19
olmi
26.06.14
✎
16:12
|
(15) Не срабатывает. Причем все отлично работает со старым Excel
(16) Этот оператор есть, я писала в коде. (17) На другие книги не переключаюсь, работаю на копии соло. (18)!!! Верно! А что сделать?) |
|||
20
olmi
26.06.14
✎
16:13
|
(18) Есть ли в 2010 Excel средства, вставляемые в 1С для автопересохранения или отказа от такого запроса?)
|
|||
21
volodya43234
26.06.14
✎
16:19
|
(20) Так, давай проверим. Сохрани из 1с в Ексель какие-то данные. Открой этот файл в екселе, ничего не изменяя, нахми "х" -закрыть. Будет спрашивать сохранить данные или нет?
|
|||
22
Масянька
26.06.14
✎
16:21
|
(19) Попробуй нечто такое
Application.DisplayAlerts = False ActiveWorkbook.SaveAs [a1] Application.DisplayAlerts = True |
|||
23
olmi
26.06.14
✎
18:25
|
(19) Идея хороша, спасибо!) Но False и True в 7.7?) Чем заменить?)
|
|||
24
acanta
26.06.14
✎
18:27
|
(23)в хелпе по васику что-то из них =-1..
|
|||
25
Масянька
26.06.14
✎
18:29
|
(23) Это к (22)?
У меня False = 0, True = 1 |
|||
26
Масянька
26.06.14
✎
18:30
|
И кстати,
Excel.ActiveWorkBook.Close(0); |
|||
27
olmi
26.06.14
✎
18:58
|
(25) Так). Этот вопрос снят, сама разобралась. Дальше сделала макрос и получила сохранение с параметром xlExcel8. Как найти его числовое значение? Или тут подскажете?)
ActiveWorkbook.SaveAs Filename:= _ ИмяФайла, FileFormat:=xlExcel8, _ Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _ CreateBackup:=False Важен, как я понимаю, только этот параметр. (26) Этого будет достаточно?) И что значит 0 в этом случае? |
|||
28
olmi
26.06.14
✎
19:00
|
(26) Кажется, нашла - 56?
|
|||
29
olmi
26.06.14
✎
19:07
|
(26) Поняла - не сохранять изменений).
|
|||
30
olmi
26.06.14
✎
19:20
|
(26) Спасибо огромное, все работает). Решение:
//Обработка закрытия файла Excel в Excel2010 Excel.DisplayAlerts = 0; Excel.ActiveWorkbook.SaveAs (ФайлТабеля,56); Excel.DisplayAlerts = 1; Excel.ActiveWorkbook.Close(0); |
|||
31
olmi
26.06.14
✎
19:21
|
Можно и заменять Excel.ActiveWorkbook на ранее определенное Книга.
|
|||
32
olmi
26.06.14
✎
19:23
|
Кстати, нашла это еще в одном месте, с кучей других радостей жизни).
http://portal.odines.ws/?p=2752 |
|||
33
Z1
26.06.14
✎
20:44
|
(31) Очень сильно помогают макросы ( может не для Вашего случая ).
Как бы идея : Включаете макрос на запись делаете все желаемые действия с xls останавливаете макрос и далее в макросе видите все совершенные действия. |
|||
34
Хоменко Валерий
27.06.14
✎
11:25
|
Интересно, а FriendVBA работает с макросами из 2010 Excel ?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |