Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.10.2016, 09:42   #1
Kostya12
Пользователь
 
Регистрация: 29.09.2016
Сообщений: 29
По умолчанию Фильтр Excel в Delphi.

Есть программа, для нахождения повторов. Суть берёт Excel таблицу переводит в массив типа variant и там я я уже работаю с массивом. Ну это по идеи она так и должна работать вот код,что в нём ни так ниже будет скриншот с ошибкой.
Код:
If OpenDialog1.Execute then Xls_Open (OpenDialog1.FileName,  StringGrid1); //кнопка для выбора файла
end;

procedure Xls_Open_filter(XLSFile:string; Grid:TStringGrid; criterion1,criterion2:string);
 const
  xlCellTypeLastCell = $0000000B;
var
  ExlApp, Sheet: OLEVariant;
 i, j, r, k, v1, v2, C: variant;


begin

     //создаем объект Excel
  ExlApp := CreateOleObject('Excel.Application');

  //делаем окно Excel невидимым
  ExlApp.Visible := false;

  //открываем файл XLSFile
  ExlApp.Workbooks.Open(XLSFile);

  //создаем объект Sheet(страница) и указываем номер листа (1)
  //в книге, с которого будем осуществлять чтение
  Sheet := ExlApp.Workbooks[ExtractFileName(XLSFile)].WorkSheets[1];

  //активируем последнюю ячейку на листе
  Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;

    // Возвращает номер последней строки
    r := ExlApp.ActiveCell.Row;

    // Возвращает номер последнего столбца
    c := ExlApp.ActiveCell.Column;

    //устанавливаем кол-во столбцов и строк в StringGrid

    Grid.RowCount:=2; //по умолчанию 2 строки
    Grid.ColCount:=c;
     //заполняем шапку таблицы (наименование полей)
    for i:= 1 to c do BEGIN
          Grid.Cells[i-1,0]:= sheet.cells[1,i];


    //считываем значение из каждой ячейки и проверяем на совпадение по 3 столбцу (Номер документа)
     for j:= 1 to r do
        //собственно сравниваем наш критерий со значением в Excel
        //функция trim убирает все лишние пробелы в строке т.е. пробелы перед и после текста
        //функция lowercase возвращает строку в нижнем регистре. uppercase - в верхнем регистре

          v1:=trim (lowercase(sheet.cells[j,4]));
        v2:=trim (lowercase(sheet.cells[j,8]); // Excel  проверяет величины
// И ищем нужные нам величины (v1, v2) в нашей таблице Grid
  rowisfind:=-1; //вначале считаем что нужного там нет
  for jjjjjjj:=0 to grid.rowcount-1 do //  Пройдём по всем заполненым строкам grid чтобы узнать, а нет ли там нужных значений
    if (grid.cells[jjjjjjj,1]=v1) and (grid.cells[jjjjjjj,2]=v2) then begin //находим их
     rowisfind:=jjjjjjj;// запомним на какой строке
     break;// дальше искать незачем
    end;

  // а теперь зная результат поиска (rowisfind)
  if rowisfind >=0 then begin //в случае найденного дубля на rowisfind строке grid
  ....
  end
  else begin // и что если такой строки не нашли
  ....
  end;


            END;

            sl.Free;
 //закрываем приложение Excel
 ExlApp.Quit;

 //очищаем выделенную память
 ExlApp := Unassigned;
 Sheet := Unassigned;

end;
Изображения
Тип файла: jpg Безымянный10.jpg (99.3 Кб, 137 просмотров)
Kostya12 вне форума Ответить с цитированием
Старый 07.10.2016, 09:45   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Чего вдруг переменные цикла типа Variant?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 07.10.2016, 10:03   #3
Kostya12
Пользователь
 
Регистрация: 29.09.2016
Сообщений: 29
По умолчанию

Ну мне посоветовали
i, j, r, k, v1, v2, C: string;
написать вместо этого



i, j, r, k, v1, v2, C: variant;
вот это
после этого ошибка в var пропала,но появилась новая.
Kostya12 вне форума Ответить с цитированием
Старый 07.10.2016, 10:17   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Ну мне посоветовали
я не знаю, кто и что Вам насоветовал, но переменный цикла (это там, где Вы пишете for i:= ...
for j:=...
должны быть ЦЕЛОЧИСЛЕННЫЕ.
переменные, к которым применяются строковые функции, должны быть строкой и т.д.

Код:
var i, j, jjjjjjj, r, c  : integer;
  v1,v2 : string;

Цитата:
после этого ошибка в var пропала,но появилась новая.
осваиваете программирование методом "тыка"? Ну-ну.. успехов...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.10.2016, 06:26   #5
Kostya12
Пользователь
 
Регистрация: 29.09.2016
Сообщений: 29
По умолчанию

Да вы правы ,я исправил. Но возникла ещё одна ошибка на этой строке
Код:
 v2:=trim (lowercase(sheet.cells[j,8]); // Excel  проверяет величины
Тут вообще пишет,что не найдена ;.
[Error] Unit5.pas(172): ')' expected but ';' found
Тут все ; уже есть,в чём может быть проблема?
Kostya12 вне форума Ответить с цитированием
Старый 10.10.2016, 06:35   #6
Kostya12
Пользователь
 
Регистрация: 29.09.2016
Сообщений: 29
По умолчанию

О понял ) нужно было добавить.
Kostya12 вне форума Ответить с цитированием
Старый 10.10.2016, 08:59   #7
Kostya12
Пользователь
 
Регистрация: 29.09.2016
Сообщений: 29
По умолчанию

Но на этом проблемы не кончились вот ещё ошибка в begin появилась
[Error] Unit5.pas(134): Type expected but 'BEGIN' found.
Kostya12 вне форума Ответить с цитированием
Старый 10.10.2016, 09:47   #8
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,544
По умолчанию

Цитата:
but 'BEGIN' found
Нашли не то что хотели(ожидали). Стало быть что-то было ранее пропущено. Смотри предыдущие строки.
а 134 строки НИ в одном из "приведенных" фрагментов кода нет.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 10.10.2016, 10:21   #9
Kostya12
Пользователь
 
Регистрация: 29.09.2016
Сообщений: 29
По умолчанию

Вот весь код ,а 1,2,3,4 строка служит для запуска Excel.
Код:
unit Unit5;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ADODB, Grids, DBGrids, StdCtrls, ComObj;

type
  TForm1 = class(TForm)
    Button3: TButton;
    Label1: TLabel;
    OpenDialog1: TOpenDialog;
    Edit1: TEdit;
    Label2: TLabel;
    StringGrid1: TStringGrid;
    Label3: TLabel;
    Edit2: TEdit;
    procedure OpenDialog1CanClose(Sender: TObject; var CanClose: Boolean);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
   Excel: Variant;
implementation
procedure Xls_Open(XLSFile:string; Grid:TStringGrid);
 const
  xlCellTypeLastCell = $0000000B;
var
  ExlApp, Sheet: OLEVariant;
  i, j, r, c:integer;

begin
    //создаем объект Excel
  ExlApp := CreateOleObject('Excel.Application');

  //делаем окно Excel невидимым
  ExlApp.Visible := false;

  //открываем файл XLSFile
  ExlApp.Workbooks.Open(XLSFile);

  //создаем объект Sheet(страница) и указываем номер листа (1)
  //в книге, с которого будем осуществлять чтение
  Sheet := ExlApp.Workbooks[ExtractFileName(XLSFile)].WorkSheets[1];

  //активируем последнюю ячейку на листе
  Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;

    // Возвращает номер последней строки
    r := ExlApp.ActiveCell.Row;

    // Возвращает номер последнего столбца
    c := ExlApp.ActiveCell.Column;

    //устанавливаем кол-во столбцов и строк в StringGrid

    Grid.RowCount:=2; //по умолчанию 2 строки
    Grid.ColCount:=c;

     //заполняем шапку таблицы (наименование полей)
    for i:= 1 to c do
          Grid.Cells[i-1,0]:= sheet.cells[1,i];


    //считываем значение из каждой ячейки и проверяем на совпадение по 5 столбцу (должность)
     for j:= 1 to r do
        //собственно сравниваем наш критерий со значением в Excel
        //функция trim убирает все лишние пробелы в строке т.е. пробелы перед и после текста
        //функция lowercase возвращает строку в нижнем регистре. uppercase - в верхнем регистре


            begin
            //если значения совпали то заносим его в таблицу grid. Не забываем что в объекте Excel нумерация строк и столбцов с 1, в Grid c 0
               for i:= 1 to c do
                  Grid.Cells[i-1,grid.RowCount-1]:= sheet.cells[j,i];
                  

            grid.RowCount:=grid.RowCount+1; //добавляем пустую строку в grid.
            end;

 //закрываем приложение Excel
 ExlApp.Quit;

 //очищаем выделенную память
 ExlApp := Unassigned;
 Sheet := Unassigned;

end;
{$R *.dfm}

procedure TForm1.OpenDialog1CanClose(Sender: TObject;
  var CanClose: Boolean); //основа программы
begin
with OpenDialog1 do  //для выбора файла
  if Execute then
    Excel.Application.WorkBooks.Add(FileName);
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
try
  Excel.Quit;
except
end;
CanClose:=True;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
If OpenDialog1.Execute then Xls_Open (OpenDialog1.FileName,  StringGrid1); //кнопка для выбора файла
end;

procedure Xls_Open_filter(XLSFile:string; Grid:TStringGrid; criterion1,criterion2:string);
 const
  xlCellTypeLastCell = $0000000B;
var
  ExlApp, Sheet: OLEVariant;
 i, j,  jjjjjjj, r, c : integer;
 v1, v2  : string;
 rowisfind:
begin

     //создаем объект Excel
  ExlApp := CreateOleObject('Excel.Application');

  //делаем окно Excel невидимым
  ExlApp.Visible := false;

  //открываем файл XLSFile
  ExlApp.Workbooks.Open(XLSFile);

  //создаем объект Sheet(страница) и указываем номер листа (1)
  //в книге, с которого будем осуществлять чтение
  Sheet := ExlApp.Workbooks[ExtractFileName(XLSFile)].WorkSheets[1];

  //активируем последнюю ячейку на листе
  Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;

    // Возвращает номер последней строки
    r := ExlApp.ActiveCell.Row;

    // Возвращает номер последнего столбца
    c := ExlApp.ActiveCell.Column;

    //устанавливаем кол-во столбцов и строк в StringGrid

    Grid.RowCount:=2; //по умолчанию 2 строки
    Grid.ColCount:=c;
     //заполняем шапку таблицы (наименование полей)
    for i:= 1 to c do BEGIN
          Grid.Cells[i-1,0]:= sheet.cells[1,i];


    //считываем значение из каждой ячейки и проверяем на совпадение по 3 столбцу (Номер документа)
     for j:= 1 to r do
        //собственно сравниваем наш критерий со значением в Excel
        //функция trim убирает все лишние пробелы в строке т.е. пробелы перед и после текста
        //функция lowercase возвращает строку в нижнем регистре. uppercase - в верхнем регистре

          v1:=trim (lowercase(sheet.cells[j,4]));
        v2:=trim (lowercase(sheet.cells[j,8])); // Excel  проверяет величины
// И ищем нужные нам величины (v1, v2) в нашей таблице Grid

  for jjjjjjj:=0 to grid.rowcount-1 do //  Пройдём по всем заполненым строкам grid чтобы узнать, а нет ли там нужных значений
    if (grid.cells[jjjjjjj,1]=v1) and (grid.cells[jjjjjjj,2]=v2) then begin //находим их
     rowisfind:=jjjjjjj;// запомним на какой строке
     break;// дальше искать незачем
    end;

  // а теперь зная результат поиска (rowisfind)
  if rowisfind >=0 then begin //в случае найденного дубля на rowisfind строке grid
  ....
  end
  else begin // и что если такой строки не нашли
  ....
  end;


            END;

            sl.Free;
 //закрываем приложение Excel
 ExlApp.Quit;

 //очищаем выделенную память
 ExlApp := Unassigned;
 Sheet := Unassigned;

end;
procedure TForm1.Button3Click(Sender: TObject);
begin
If OpenDialog1.Execute then Xls_Open_filter (OpenDialog1.FileName, StringGrid1, Edit1.Text, Edit2.Text);
end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
const //здесь определяем ваш цвет. Так же можно использовать цвета по умолчанию.
  clPaleGreen = TColor($CCFFCC);
  clPaleRed = TColor($CCCCFF);
begin
  //Если ячейка получает фокус,то нам надо закрасить её другими цветами
  if (gdFocused in State) then
  begin
    StringGrid1.Canvas.Brush.Color := clBlack;
    StringGrid1.Canvas.Font.Color := clWhite;
  end
  else //Если же ячейка теряет фокус,то закрашиваем её коасным и зелёным.
    if (ACol=7) or(ACol=3)  then //Восьмая ячейка будет зелёной,другие - ячейки красные
      StringGrid1.Canvas.Brush.color := clPaleGreen
    else
      StringGrid1.canvas.brush.Color := clPaleRed;

  //Теперь закрвсим ячйки,но только,если ячейка не Title- Row/Column
  //Естественно это зависит от того,есть у вас title-Row/Columns ??? ???.

  if (ACol > 0) and (ARow > 0) then
  begin
    //Закрашиваем бэкграунд
    StringGrid1.Canvas.FillRect(Rect);

    //Закрашиваем текст (Text). Так же здесь можно добавить выравнивание и   т.д..
    StringGrid1.Canvas.TextOut(Rect.Left, Rect.Top, StringGrid1.Cells[ACol, ARow]);
  end;
end;






end.

end.

end.
Kostya12 вне форума Ответить с цитированием
Старый 10.10.2016, 10:25   #10
Kostya12
Пользователь
 
Регистрация: 29.09.2016
Сообщений: 29
По умолчанию

Я так понял,что переменную я в var дописал, а ТИП переменной нет. Мне кажется в этом была вся проблема.
Kostya12 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Excel: фильтр по массовому вхождению kitreklama Microsoft Office Excel 14 27.09.2016 15:19
фильтр-сортировка excel 2003 Sharrik Microsoft Office Excel 2 25.07.2013 09:13
Фильтр с combobox в excel VinDiz Помощь студентам 0 25.12.2012 20:59
Фильтр по дате Otlook из Excel Rojohn Microsoft Office Excel 0 05.10.2010 13:24
Фильтр в Access как в Excel Flangini Microsoft Office Access 5 05.03.2010 08:11