| 
| 
 | Вопрос # 5 542/ вопрос открыт / | 
 |  Доброго времени суток, уважаемые эксперты!Немного расширю свой вопрос № 5530
 Подскажите как реализовать поиск в файле EXCEL (см.вложение).
 Задача следующая.
 Необходимо выполнить поиск по ФИО (берется из Edit) и в случае нахождения (например Петров Петр Петрович) скопировать в SrtringGrid:
 1. Все что находится правее ячеек Основной режим/Сверхурочно/Итого (серая заливка)- в первый SrtringGrid.
 2. Все что находится ниже ячеек Наименование/дата списания/кол-во/Примечание (серая заливка)- - во второй SrtringGrid.
 С открытием файла Excel проблем нет...
 Проблема с поиском и выводом найденного в SrtringGrid
 
 Заранее благодарен
 Al_Sha
 К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса) 
|  |   Вопрос задал: Al_Sha (статус: Посетитель)Вопрос отправлен: 30 июля 2011, 06:42
 Состояние вопроса: открыт, ответов: 1.
 |  Ответ #1. Отвечает эксперт: Шичко Игорь Здравствуйте, Al_Sha!Предлагаю общий вариант решения задачи.
 Предполагается:
 - данных по одному и тому же сотруднику может быть несколько на одном листе
 - ищется точное совпадение фамилии, имени и отчества
 
 Код и описание - в приложении
 Вопросы пишите в форум
 Приложение:Переключить в обычный режим uses  ..., ComObj,...;    dan1 = record   osn: real;   sv: real;   itog: real;   end;  dan2 = record    naim: string;    kol: integer;    d_spis: TDate;    prim: string;    end;  TForm1 = class(TForm)    Button1: TButton;    Edit1: TEdit;    StringGrid1: TStringGrid;    StringGrid2: TStringGrid;... procedure TForm1.Button1Click(Sender: TObject);varEx, WorkBook, Sheet: variant;i, row_tek, row_all, kol_1, kol_2: integer;a1:array of dan1;a2:array of dan2; begin  kol_1:= 0; kol_2:= 0;   StringGrid1.RowCount:= kol_1 + 1;  StringGrid2.RowCount:= kol_2 + 1;  Ex:= CreateOleObject('Excel.Application');  Ex.Visible:= True;   Sheet:= WorkBook.ActiveSheet;   for i:= 1 to row_all do  begin     begin      a1[kol_1 - 1].sv:= Sheet.Range['d' + inttostr(i + 9)].value;    a1[kol_1 - 1].itog:= Sheet.Range['d' + inttostr(i + 10)].value;    StringGrid1.RowCount:= kol_1 + 1;     StringGrid1.Cells[1, StringGrid1.RowCount -1]:= FloatToStr(a1[kol_1 - 1].sv);    StringGrid1.Cells[2, StringGrid1.RowCount -1]:= FloatToStr(a1[kol_1 - 1].itog);    row_tek:= i + 14;       begin      kol_2:= kol_2 + 1; SetLength(a2, kol_2);        try         a2[kol_2 - 1].d_spis:= StrToDate(VarToStr(Sheet.Range['d' + inttostr(row_tek)].value));        a2[kol_2 - 1].kol:= StrToInt(VarToStr(Sheet.Range['e' + inttostr(row_tek)].value));        a2[kol_2 - 1].prim:= Sheet.Range['f' + inttostr(row_tek)].value;        except        end;      StringGrid2.RowCount:= kol_2 + 1;       StringGrid2.Cells[1, StringGrid2.RowCount -1]:= DateToStr(a2[kol_2 - 1].d_spis);      StringGrid2.Cells[2, StringGrid2.RowCount -1]:= IntToStr(a2[kol_2 - 1].kol);      StringGrid2.Cells[3, StringGrid2.RowCount -1]:= a2[kol_2 - 1].prim;      row_tek:= row_tek + 1;      end;      end;  end;  end; 
|  | Ответ отправил: Шичко Игорь (статус: 9-ый класс)Время отправки: 30 июля 2011, 11:20
 Оценка за ответ: 5
 Комментарий к оценке: спасибо... |  
 Мини-форум вопросаВсего сообщений: 4; последнее сообщение — 2 августа 2011, 15:09; участников в обсуждении: 2. 
|   | Шичко Игорь (статус: 9-ый класс), 30 июля 2011, 10:41 [#1]:Al_Sha: 
 Вопрос: на каждом листе отдельно взятая фамилия встречается только один раз (как в Вашем примере) или может встречаться много раз? От этого зависит алгоритм для применения в проекте.
 |  
|   | Al_Sha (статус: Посетитель), 30 июля 2011, 18:29 [#2]:Да, на каждом листе отдельно взятая фамилия встречается только один раз. 
 С уважением
 Al_Sha
 |  
|   | Шичко Игорь (статус: 9-ый класс), 30 июля 2011, 22:42 [#3]:Al_Sha: 
 В принципе я привел общий алгоритм, поэтому можно использовать.
 |  
|   | Al_Sha (статус: Посетитель), 2 августа 2011, 15:09 [#4]:Спасибо за столь изящный и работоспособный код... 
 С уважением
 Al_Sha
 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |