![]() |
![]() |
![]() |
|
1с8 объединение excel | ☑ | ||
---|---|---|---|---|
0
jo
18.05.18
✎
11:04
|
Приветствую, есть обработка по объединению документов эксель из каталога в новый файл на один лист списком.
В 2007 офисе отрабатывает нормально, в 2010 и далее начинает ругаться на строку: ДокЭксель.Sheets(1).Range(НачОбл, КонОбл).Select(); Ошибка при вызове метода контекста (Range) Кто-нибудь знает в чем секрет? Провобовал переписывать через: ЛистПриемник.Rows(""+НачСтрока+":"+КонСтрока").Select() проблема та же ДокЭксель = Новый COMОбъект("Excel.Application"); ДокЭксель.DisplayAlerts = Ложь; ОбщаяКнига = ДокЭксель.WorkBooks.Add(); НовыйЛист = ОбщаяКнига.WorkSheets(1); НайденныеФайлы = НайтиФайлы(Объект.ПутьКФайлам, "*.xls*"); СЗ = Новый СписокЗначений; СЗ.ЗагрузитьЗначения(НайденныеФайлы); СЗ.СортироватьПоЗначению(); НайденыеФайлы = СЗ.ВыгрузитьЗначения(); Сч = 0; Для каждого ФайлЭксель Из НайденныеФайлы Цикл ПутьФайла = ФайлЭксель.ПолноеИмя; ДокЭксель.WorkBooks.Open(ПутьФайла); ТекущийЛист = ДокЭксель.ActiveWorkbook.Sheets(1); НачОбл = ТекущийЛист.Cells(1,1); КонОбл = ТекущийЛист.Cells(42,37); ДокЭксель.Sheets(1).Range(НачОбл, КонОбл).Select(); ДокЭксель.Selection.Copy(); НовыйЛист.Activate(); НачОбл = НовыйЛист.Cells(1+Сч,1); КонОбл = НовыйЛист.Cells(42+Сч,37); ДокЭксель.Sheets(1).Activate(); ДокЭксель.Sheets(1).Range(НачОбл, КонОбл).Select(); ДокЭксель.Selection.Insert(); Сч=Сч+44; КонецЦикла; ОбщаяКнига.saveAs(Объект.ПутьКФайлам + "\" + "_Общий"); ДокЭксель.ActiveWorkbook.close(); ДокЭксель.Quit(); |
|||
1
НЕА123
18.05.18
✎
11:32
|
(0)
ДокЭксель.ActiveWorkbook.Sheets(1) равно ДокЭксель.Sheets(1) ? |
|||
2
lodger
18.05.18
✎
11:33
|
имхо, проще обновиться до новых версий платформы и отказаться от этого изварата.
p.s. в новых версиях можно сохранять многостраничный эксель из 1с. |
|||
3
jo
18.05.18
✎
11:42
|
(1)
не ДокЭксель.ActiveWorkbook.Sheets(1) - источник ДокЭксель.Sheets(1) - приемник |
|||
4
НЕА123
18.05.18
✎
11:55
|
(3)
я про этот кусок ТекущийЛист = ДокЭксель.ActiveWorkbook.Sheets(1); НачОбл = ТекущийЛист.Cells(1,1); КонОбл = ТекущийЛист.Cells(42,37); ДокЭксель.Sheets(1).Range(НачОбл, КонОбл).Select(); |
|||
5
jo
18.05.18
✎
11:58
|
(4) да тот же лист
|
|||
6
НЕА123
18.05.18
✎
12:10
|
ИМХО, попытка в range указать ячейки другого листа.
НовыйЛист.Activate(); НачОбл = НовыйЛист.Cells(1+Сч,1); КонОбл = НовыйЛист.Cells(42+Сч,37); ДокЭксель.Sheets(1).Activate(); ДокЭксель.Sheets(1).Range(НачОбл, КонОбл).Select(); ДокЭксель.Selection.Insert(); заменить на типа НовыйЛист.Activate(); НачОбл = НовыйЛист.Cells(1+Сч,1); КонОбл = НовыйЛист.Cells(42+Сч,37); НовыйЛист.Range(НачОбл, КонОбл).Select(); ДокЭксель.Selection.Insert(); |
|||
7
jo
18.05.18
✎
15:10
|
(6) нет, не в этом дело. Почему то ни в какой варианте кода, не хочет переключаться между листами разных открытых книг. Получилось сделать, только через промежуточное сохранение файла.
Вот код, если надо кому: &НаКлиенте Процедура вып(Команда) НайденныеФайлы = НайтиФайлы(Объект.ПутьКФайлам, "*.xls*"); СЗ = Новый СписокЗначений; СЗ.ЗагрузитьЗначения(НайденныеФайлы); СЗ.СортироватьПоЗначению(); НайденыеФайлы = СЗ.ВыгрузитьЗначения(); Сч = 0; Эксель = Новый COMОбъект("Excel.Application"); Эксель.DisplayAlerts = Ложь; Эксель.WorkBooks.Add(); Эксель.ActiveWorkBook.saveAs(Объект.ПутьКФайлам + "\" + "_Общий"); Эксель.ActiveWorkBook.Close(); Для каждого ФайлЭксель Из НайденныеФайлы Цикл ПутьФайла = ФайлЭксель.ПолноеИмя; Эксель.WorkBooks.Open(ПутьФайла); ТекущийЛист = Эксель.ActiveSheet; ЛистФормата = ?(Сч=0,Истина,Ложь); СкопироватьЛистЭксельВКонец(Эксель,ТекущийЛист,4,ЛистФормата); Сч=Сч+1; КонецЦикла; Эксель.Quit(); КонецПроцедуры &НаКлиенте Процедура ПутьКФайламНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) Режим = РежимДиалогаВыбораФайла.ВыборКаталога; ДиалогОткрытия = Новый ДиалогВыбораФайла(Режим); ДиалогОткрытия.Каталог = ""; ДиалогОткрытия.МножественныйВыбор = Ложь; ДиалогОткрытия.Заголовок = "Выберите каталог"; Если ДиалогОткрытия.Выбрать() Тогда Объект.ПутьКФайлам = ДиалогОткрытия.Каталог; КонецЕсли; КонецПроцедуры &НаКлиенте Процедура СкопироватьЛистЭксельВКонец(Эксель,ЛистИсточник,КоличествоСтрокОтступа,ЛистФормата) КоординатыИсточника = КоординатыОбласти(ЛистИсточник); ЛистИсточник.Activate(); ВыделитьДиапазон(ЛистИсточник,КоординатыИсточника.НачальнаяСтрока,КоординатыИсточника.КонечнаяСтрока); Эксель.Selection.Copy(); Эксель.WorkBooks.Open(Объект.ПутьКФайлам + "\" + "_Общий"); ЛистПриемник = Эксель.ActiveSheet; КоординатыПриемника = КоординатыОбласти(ЛистПриемник); Если ЛистФормата Тогда НомерСтрокиНачалаВставки = 1; НомерСтрокиКонцаВставки = КоординатыИсточника.КонечнаяСтрока; Иначе НомерСтрокиНачалаВставки = КоординатыПриемника.КонечнаяСтрока+КоличествоСтрокОтступа; НомерСтрокиКонцаВставки = НомерСтрокиНачалаВставки+КоординатыИсточника.КонечнаяСтрока; КонецЕсли; ВыделитьДиапазон(ЛистПриемник,НомерСтрокиНачалаВставки,НомерСтрокиКонцаВставки); Эксель.Selection.Insert(); Эксель.Selection.Cells(1).Select(); Эксель.ActiveWorkBook.Save(); Эксель.ActiveWorkBook.Close(); КонецПроцедуры &НаКлиенте Функция КоординатыОбласти(Лист) НачальнаяСтрока = 1; НачальнаяКолонка = 1; КонечнаяКолонка = Лист.Cells.CurrentRegion.Columns.Count; КонечнаяСтрока = Лист.UsedRange.Rows.Count; СтруктураКоординат = Новый Структура("НачальнаяКолонка,НачальнаяСтрока,КонечнаяКолонка,КонечнаяСтрока" ,НачальнаяКолонка,НачальнаяСтрока,КонечнаяКолонка,КонечнаяСтрока); Возврат СтруктураКоординат; КонецФункции &НаКлиенте Функция ДиапазонОбласти(Лист,Координаты) Диапазон = Лист.Range(Лист.Cells(Координаты.НачальнаяСтрока,Координаты.НачальнаяКолонка), Лист.Cells(Координаты.КонечнаяСтрока,Координаты.КонечнаяКолонка)); Возврат Диапазон; КонецФункции &НаКлиенте Процедура ВыделитьДиапазон(Лист,НачальнаяСтрока,КонечнаяСтрока) ДиапазонСтрок=Лист.Rows(""+Строка(НачальнаяСтрока)+ ":" +Строка(КонечнаяСтрока)); ДиапазонСтрок.Select(); КонецПроцедуры |
|||
8
olegves
18.05.18
✎
15:12
|
(0) вчера полдня с этим воевал - перенесли базы на новый сервер - а там новый офис.
Я нашел такое решение: посл строки активизации: Эксель.ActiveSheet.Cells.Select(); |
|||
9
olegves
18.05.18
✎
15:14
|
+(8) попробуй
ДокЭксель.Sheets(1).Activate(); ДокЭксель.ActiveSheet.Cells.Select(); |
|||
10
olegves
18.05.18
✎
15:15
|
(9) вместо Cells можешь свой Range(НачОбл, КонОбл) подставить
|
|||
11
olegves
18.05.18
✎
15:23
|
для переключения workbooks(Индекс).Activate() надо использовать
|
|||
12
olegves
18.05.18
✎
15:25
|
вот рабочий код, кому надо:
КнигаИсточник = Эксель.WorkBooks.Open(ИмяФайлаОтчета); КопируемыйЛист = КнигаИсточник.WorkSheets(1); КопируемаяОбласть = КопируемыйЛист.Cells.Select(); Эксель.Selection.Copy(); Если КнигаПриемник = Неопределено Тогда КнигаПриемник = Эксель.WorkBooks.Add(); КонецЕсли; ЧистыйЛист = КнигаПриемник.Sheets.Add(); ЧистыйЛист.Name = ИмяЛиста; ЧистыйЛист.Paste(); //Устанавливаем шрифт и его размер такой же как в оригинале ЧистыйЛист.Activate(); //ЧистыйЛист.Range("A1:O1000").Select(); Эксель.ActiveSheet.Cells.Select(); Эксель.Selection.Font.Name = "Arial"; Эксель.Selection.Font.Size = 8; Эксель.Selection.Interior.ColorIndex = -4142; Сообщить("Успешно создан лист "+ИмяОтчета); КнигаИсточник.Close(False); |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |