Имя: Пароль:
1C
1С v8
Загрузка из Excel только отфильтрованных значений
, ,
0 FeeL86
 
19.06.12
11:38
Добрый день.
Помогите разобраться. Есть файл excel 2007  в нем настроен фильтр по колонке. Не могу понять как получить именно те данные которые отфильтровал excel. Пока что пришлось перебирать все строки и отлавливать нужные с помощью условия.

Пример кода:


Excel = Новый COMОбъект("Excel.Application");
   xlLastCell = 11;
   Результат = 0;
   
   Попытка
       Excel.WorkBooks.Open(ПутьКФайлу);
       ExcelЛист = Excel.Sheets(1);
   Исключение
       Сообщить(ОписаниеОшибки());
   КонецПопытки;
   
   ActiveCell = Excel.ActiveCell.SpecialCells(xlLastCell);
   RowCount = ActiveCell.Row;
   ColumnCount = ActiveCell.Column;
           
   Для Row = 2 По RowCount-1 Цикл                        
       Для Column = 1 По ColumnCount-4 Цикл
                               
           Если Column = 1 Тогда //Это код сотрудника
               ТабНомерСотрудника = СокрЛП(ExcelЛист.Cells(Row,Column).Text);
               Сотрудник = Справочники.СотрудникиОрганизаций.НайтиПоКоду(ТабНомерСотрудника);
               
           ИначеЕсли Column = 3 Тогда //Это результат начисления    
               Результат = ?(ExcelЛист.Cells(Row,Column).Text = "", 0, Число(ExcelЛист.Cells(Row,Column).Text));                
           КонецЕсли;
           
       КонецЦикла;
       
       Если Результат > 0 Тогда
           НоваяСтрока = Начисления.Добавить();
           НоваяСтрока.ТабельныйНомер = Сотрудник.Код;
           НоваяСтрока.Сотрудник = Сотрудник;
           НоваяСтрока.ПодразделениеОрганизации = Сотрудник.ПодразделениеОрганизации;
           НоваяСтрока.Результат = Результат;
       КонецЕсли;
               
   КонецЦикла;
       
   ФормаПрогресБар.Закрыть();
   Excel.WorkBooks.Close();
   Excel = 0;
1 DrShad
 
19.06.12
11:42
считать всю область через COMSafeAray в ТЗ и наложить через запрос отборы из фильтра
2 smaharbA
 
19.06.12
11:44
через оле получаем значение фильтра - это и будет массив отфильтрованных значений
3 FeeL86
 
19.06.12
11:52
DrShad, есть метод который позволяет выгрузить в тз всю область? Или в цикле заливать все записи в тз?
4 FeeL86
 
19.06.12
11:57
smaharbA через OLE и запросом RecordSet-у можно сделать выборку. Но меня интересует как через ком объект Excel.Application можно обойти циклом результат фильтрации Excel`а
5 smaharbA
 
19.06.12
11:59
(4) в (2) все написано
6 smaharbA
 
19.06.12
12:01
(3) для восьмерки элементарно про всю область

Область=Лист.UsedRange;
Массив=Область.Value;
7 smaharbA
 
19.06.12
12:39
автор с автофильром еще (2) и (6) не сообразил ?


если это автофильтр

Автофильтр=Лист.AutoFilter;
Область=Лист.Range;
Отфильтрованные=Область.SpecialCells(12);
Массив=Отфильтрованные.Value;


с фильтрами и прочим скрытием точно так же
8 FeeL86
 
19.06.12
12:52
Вариант с автофильтром (6) не возвращает данных
9 smaharbA
 
19.06.12
12:54
(8) да ну на
10 FeeL86
 
19.06.12
12:59
Если делаю Лист.UsedRange.Value получаю массив всей области.
Если Лист.AutoFilter.Range.SpecialCells(12).Value то возвращает массив с названиями колонок
11 Jaap Vduul
 
19.06.12
13:00
(8) В (6) не автофильтр, в (7) исправился
12 Jaap Vduul
 
19.06.12
13:06
(10)SpecialCells и не нужен, просто AutoFilter.Range.Value
В справке к VBA так и написано:
Use the AutoFilter property to return the AutoFilter object. Use the Filters property to return a collection of individual column filters. Use the Range property to return the Range object that represents the entire filtered range
13 FeeL86
 
19.06.12
13:11
Хорошо делаю Лист.AutoFilter.Range.Value и получаю аналогичный результат если бы написал Лист.UsedRange.Value
14 smaharbA
 
19.06.12
13:15
Автофильтр=Лист.AutoFilter;
Область=Лист.Range;
Отфильтрованные=Область.SpecialCells(12);
Области=Отфильтрованные.Areas;
Массив=Новый Массив;
Для Каждого Область Из Области
   Массив.Добавить(Область.Value);
КонецЦикла;


как то так, не адинеснег и тем боле восьмерку не знаю
15 smaharbA
 
19.06.12
13:16
(12) нужен, иначе получишь всю область неофильтрованную
16 FeeL86
 
19.06.12
13:22
я уж понял что без SpecialCells(12) т.к. число 12 = xlVisible т.е те области которые видим
17 Jaap Vduul
 
19.06.12
13:27
Тогда вот так:
Лист.AutoFilter.Range.Offset(1).Resize(Лист.AutoFilter.Range.Rows.Count-1).SpecialCells(12).Value
18 smaharbA
 
19.06.12
13:38
в (14) наверняка рабочий код, но вытянет и заголовок автофильтра
ибо универсально для областей со скрытыми любым способом ячеейками - будь то фильтр, автофильтр, ручное скрытие, группировки и т.д.
19 FeeL86
 
19.06.12
14:25
Спасибо всем за помощь, разобрался
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший