Имя: Пароль:
1C
1С v8
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);
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой