Как найти строку в Excel по значению без цикла

1. NatalyaVP 16.12.14 09:00 Сейчас в теме
Здравствуйте.

Подскажите как в Excelе найти строку по заданному значению, без перебора всех строк, что-то наподобие Найти(строкаExcel,значение).

Я сейчас ищу перебором всех строк в листе.

Спасибо.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. oldfornit 16.12.14 09:44 Сейчас в теме
(1) NatalyaVP, думаю http://infostart.ru/public/163640/ - то, что Вам нужно
NatalyaVP; +1 Ответить
3. NatalyaVP 16.12.14 14:39 Сейчас в теме
(2), Не могу там ничего найти. Там перебор строк показан.
Я использую COMОбъект("Excel.Application").
4. Dem1urg 387 16.12.14 14:51 Сейчас в теме
Процедура Сформировать()
    Ексель=СоздатьОбъект("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);
    Исключение
        Сообщить("Нету нифига!!!");
    КонецПопытки;
КонецПроцедуры
Показать
zzz14; Рамзес; SIrina9; igor_demin@mail.ru; unichkin; gradi; smit1c; NatalyaVP; +8 Ответить
5. gradi 5 03.01.15 11:12 Сейчас в теме
(4) Dem1urg, спасибо за пример. Кратко и доступно.
11. zzz14 24 19.03.24 07:43 Сейчас в теме
(4)
Нужно учитывать, что поиск ведется после ячейки, указанной во втором параметре.
6. mashinist 6 03.01.15 11:26 Сейчас в теме
А можно еще через ADO простым SELECT'ом...
7. gradi 5 03.01.15 21:17 Сейчас в теме
(6) mashinist, можете пример выложить?
8. mashinist 6 03.01.15 21:25 Сейчас в теме
     	ЗаголовкиВСтроке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. gradi 5 04.01.15 09:49 Сейчас в теме
(8) mashinist, ваш вариант более громоздкий. На сколько я понимаю, ADO позволяет читать данные, а работать со структурой документа не может.
Очевидно, что необходимо выбирать соответствующий задаче инструмент.
10. mashinist 6 04.01.15 10:45 Сейчас в теме
(9) я не совсем согласен
задача была
найти строку по заданному значению, без перебора всех строк

о работе со структурой документа ничего не говорилось. приведен пример как в принципе сделать SELECT
кусок кода громоздкий т.к. это универсальная функция, которая читает любую таблицу в ТЗ
ИМХО если реально нужно что-то найти в таблице экселя, то ADO + SELECT ... LIKE удобнее т.к. в Find найдет только первое значение и если нужно удостовериться в том, что оно единичное, то все равно нужно использовать еще и FindNext
к тому же ADO не требует установки EXCEL на компьютере

в целом все зависит от задачи...
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот