|
Вопрос # 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);
- var
- Ex, 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
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|