Как найти строку в Excel по значению без цикла
По теме из базы знаний
- Всякие полезности
- Загрузка из EXCEL в 1С. com.sun.star.ServiceManager (LibreOffice/OpenOffice)
- Отбор/фильтр в отчетах/СКД/обработках 1C: БП, УТ, ERP, Кронос: WMS по файлу Excel, текстовому файлу или списку текстовых строк (номер документа, артикул, ИНН, QR-код, штрих-код, наименование)
- Быстрая выгрузка в Excel с оформлением (числа, даты, колонтитулы, гиперссылки) через OpenXML
- Консоль кода с поддержкой объявления процедур и функций, с дополнительными функциями отслеживания и вывода значений
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Процедура Сформировать()
Ексель=СоздатьОбъект("Excel.Application");
Книга=Ексель.Workbooks.Open("c:\Книга1.xls");
Листы=Книга.Worksheets;
Лист=Листы.Item(1);
Диапазон=Лист.UsedRange;
Попытка
Поиск=Диапазон.Find("1236", Диапазон.Cells(1, 1), -4123, 1, 1, 1, 0, 0);
Сообщить(Поиск.Address);
Исключение
Сообщить("Нету нифига!!!");
КонецПопытки;
Попытка
Поиск=Диапазон.Find("123", Диапазон.Cells(1, 1), -4123, 1, 1, 1, 0, 0);
Сообщить(Поиск.Address);
Исключение
Сообщить("Нету нифига!!!");
КонецПопытки;
КонецПроцедуры
Показать ЗаголовкиВСтроке1 = "HDR=NO;";
СтрокаСоединения ="Provider=Microsoft.ACE.OLEDB.12.0;Data Source= " + СокрЛП(пФайл) +" ;Extended Properties=""Excel 8.0;" + ЗаголовкиВСтроке1 + "IMEX=1;""";
Connection = Новый COMОбъект("ADODB.Connection");
Connection.ConnectionString = СтрокаСоединения;
Попытка
Connection.Open();
Исключение
Сообщить ("Проблемы с подключением к Excel" );
Сообщить(ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;
RS = Новый COMОбъект("ADODB.Recordset");
ТекстЗапроса =
"SELECT
| Лист.*
|FROM
| [" + пЛист + "$] as Лист";
Попытка
RS.Open(ТекстЗапроса, Connection);
Исключение
Сообщить ("Проблемы с выполнением запроса");
Возврат Неопределено;
КонецПопытки;
Таблица = Новый ТаблицаЗначений;
Если СтруктураКолонок = Неопределено Тогда
Для Счетчик = 1 По RS.Fields.Count Цикл
Поле = RS.Fields.Item(Счетчик - 1);
Колонка = Таблица.Колонки.Добавить("К" + Счетчик, , Поле.Name);
КонецЦикла;
Иначе
Для каждого КлючИЗначение Из СтруктураКолонок Цикл
Колонка = Таблица.Колонки.Добавить(КлючИЗначение.Ключ);
КонецЦикла;
КонецЕсли;
НомерСтроки = 0;
// КолвоСтрок = RS.RecordCount;
Пока RS.EOF() = 0 Цикл
НомерСтроки = НомерСтроки + 1;
#Если Клиент Тогда
Состояние("Чтение файла: " + Формат(НомерСтроки) + " из " + Формат(КолвоСтрок));
Индикатор.Значение = Индикатор.Значение + 1;
ОбработкаПрерыванияПользователя();
#КонецЕсли
Если НомерСтроки < НачСтрока Тогда
RS.MoveNext();
Продолжить;
КонецЕсли;
Если КонСтрока > 0 И НомерСтроки > КонСтрока Тогда
Прервать;
КонецЕсли;
НоваяСтрока = Таблица.Добавить();
Если СтруктураКолонок = Неопределено Тогда
Для Счетчик = 1 По RS.Fields.Count Цикл
Поле = RS.Fields.Item(Счетчик - 1);
НоваяСтрока["К" + Счетчик] = Поле.Value;
КонецЦикла;
Иначе
Для каждого КлючИЗначение Из СтруктураКолонок Цикл
Поле = RS.Fields.Item(КлючИЗначение.Значение - 1);
НоваяСтрока[КлючИЗначение.Ключ] = Поле.Value;
КонецЦикла;
КонецЕсли;
// Обработка других полей
RS.MoveNext();
КонецЦикла;
// Завершение работы
RS.Close();
Connection.Close();
Показать
(9) я не совсем согласен
задача была
о работе со структурой документа ничего не говорилось. приведен пример как в принципе сделать SELECT
кусок кода громоздкий т.к. это универсальная функция, которая читает любую таблицу в ТЗ
ИМХО если реально нужно что-то найти в таблице экселя, то ADO + SELECT ... LIKE удобнее т.к. в Find найдет только первое значение и если нужно удостовериться в том, что оно единичное, то все равно нужно использовать еще и FindNext
к тому же ADO не требует установки EXCEL на компьютере
в целом все зависит от задачи...
задача была
найти строку по заданному значению, без перебора всех строк
о работе со структурой документа ничего не говорилось. приведен пример как в принципе сделать SELECT
кусок кода громоздкий т.к. это универсальная функция, которая читает любую таблицу в ТЗ
ИМХО если реально нужно что-то найти в таблице экселя, то ADO + SELECT ... LIKE удобнее т.к. в Find найдет только первое значение и если нужно удостовериться в том, что оно единичное, то все равно нужно использовать еще и FindNext
к тому же ADO не требует установки EXCEL на компьютере
в целом все зависит от задачи...
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот