Вход | Регистрация

1С:Предприятие :: 1С:Предприятие 8 общая

1с8 объединение excel

1с8 объединение excel
Я
   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();
 
 
   НЕА123
 
1 - 18.05.18 - 11:32
(0)
ДокЭксель.ActiveWorkbook.Sheets(1)
равно
ДокЭксель.Sheets(1)
?
   lodger
 
2 - 18.05.18 - 11:33
имхо, проще обновиться до новых версий платформы и отказаться от этого изварата.
p.s. в новых версиях можно сохранять многостраничный эксель из 1с.
   jo
 
3 - 18.05.18 - 11:42
(1)
не

ДокЭксель.ActiveWorkbook.Sheets(1) - источник
ДокЭксель.Sheets(1) - приемник
   НЕА123
 
4 - 18.05.18 - 11:55
(3)
я про этот кусок
                               ТекущийЛист = ДокЭксель.ActiveWorkbook.Sheets(1);
                               НачОбл = ТекущийЛист.Cells(1,1);
                               КонОбл = ТекущийЛист.Cells(42,37);
                               ДокЭксель.Sheets(1).Range(НачОбл, КонОбл).Select();
   jo
 
5 - 18.05.18 - 11:58
(4) да тот же лист
   НЕА123
 
6 - 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();
   jo
 
7 - 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();

КонецПроцедуры
   olegves
 
8 - 18.05.18 - 15:12
(0) вчера полдня с этим воевал - перенесли базы на новый сервер - а там новый офис.
Я нашел такое решение:
посл строки активизации:
                Эксель.ActiveSheet.Cells.Select();
   olegves
 
9 - 18.05.18 - 15:14
+(8) попробуй
ДокЭксель.Sheets(1).Activate();
ДокЭксель.ActiveSheet.Cells.Select();
   olegves
 
10 - 18.05.18 - 15:15
(9) вместо Cells можешь свой Range(НачОбл, КонОбл) подставить
 
 Рекламное место пустует
   olegves
 
11 - 18.05.18 - 15:23
для переключения workbooks(Индекс).Activate() надо использовать
   olegves
 
12 - 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);

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует