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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.08.2010, 15:26   #1
iskurt
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 228
По умолчанию Поиск в Экселе

Код:
var 
  op:integer;

  np := Edit3.Text;

  Exel := CreateOleObject('Excel.Application'); 
  Exel.Workbooks.Open(out_exl);                
  op:=Exel.ActiveSheet.UsedRange.Rows.Count;    // переменная для поиска

  Exel.Range['D2','D'+IntToStr(op)].select;
  Exel.Selection.Find(np);

  Value := Exel.ActiveSheet.UsedRange.Find(np);
  ShowMessage(Value.Address);
  Exel.Visible := true;
Собственно вот вопрос. Этот код позволяет мне увидеть адрес ячейки по поиску текста, но выдает адрес не входящий в выделенный диапазон. К примеру, мне выдает $C$6
Мне же нужно чтобы поиск производился в диапазоне
Код:
Exel.Range['D2','D'+IntToStr(op)].select;
Где я накосячил, подскажите?

Последний раз редактировалось iskurt; 13.08.2010 в 15:30. Причина: дописал описание проблемы
iskurt вне форума Ответить с цитированием
Старый 14.08.2010, 04:25   #2
Karabash
Форумчанин
 
Регистрация: 26.07.2009
Сообщений: 216
По умолчанию

Код:
var 
  op:integer;
  np := Edit3.Text;

  Exel := CreateOleObject('Excel.Application'); 
  Exel.Workbooks.Open(out_exl);
  //этот оператор вернет общее количество строк, занятых данными
  op:=Exel.ActiveSheet.UsedRange.Rows.Count; 
  //поэтому следующий оператор может выделит странный диапазон, который не захватит все строки с данными:
  //например, если данные занимают 10 строк, а строка, с которой начинаются данные имеет номер 5, 
  //то выделенный диапазон захватит примерно половину строк с данными
  Exel.Range['D2','D'+IntToStr(op)].select;
  Exel.Selection.Find(np);

  Value := Exel.ActiveSheet.UsedRange.Find(np);
  ShowMessage(Value.Address);
  Exel.Visible := true;
В общем, скорее всего, причина недоумения в неверном определении выделяемого диапазона.
Проверка показала, что при правильном выделении диапазона все работает нормально: символы в ячейках ищутся только в заданном диапазоне.
Обработка ошибки, которая появляется если заданные символы в выделенном диапазоне ячеек не найдены, предоставляется автору.
Karabash вне форума Ответить с цитированием
Старый 16.08.2010, 12:50   #3
iskurt
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 228
По умолчанию

Хорошо, привожу пример - делаю эксель видимым, на экране вот что


но адрес найденой ячейки никак не в диапазоне выделенного
iskurt вне форума Ответить с цитированием
Старый 16.08.2010, 14:52   #4
Karabash
Форумчанин
 
Регистрация: 26.07.2009
Сообщений: 216
По умолчанию

Привожу пример выполнение кода почти без переделок:
Изображения
Тип файла: gif 004.gif (10.3 Кб, 128 просмотров)
Karabash вне форума Ответить с цитированием
Старый 18.08.2010, 14:52   #5
iskurt
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 228
По умолчанию

так это просто совпадение.
Попробуй в файле в разных местах раскидать... в начале, в середине и в конце....
Эксель ищет построчно, т.е. А1, В1, С1......
Попробуй впиши в А1 в В1...... цифру 3...

Жду результатов... т.к. мне этот поиск важен и принципиален...
Благодарю за сотрудничество.

PS: вот мой скрин, поиск был цифра восемь - "8"


Вы использовали мой код или писали свой?

Последний раз редактировалось iskurt; 18.08.2010 в 15:03.
iskurt вне форума Ответить с цитированием
Старый 18.08.2010, 17:11   #6
Karabash
Форумчанин
 
Регистрация: 26.07.2009
Сообщений: 216
По умолчанию

Действительно, в том виде как мы пытались делать, код показывает ячейку вне диапазона.
Пришлось взяться за хирургические инструменты.
Вот что получилось.
Код:
uses ComObj, ExcelXP, OleServer;
...
procedure xxxx;
var
  op : integer;
  np : string;
  XL: TExcelApplication;
  R : ExcelRange;
  Adr : string;
begin
  np := Edit3.Text;
  XL := TExcelApplication.Create(nil);
  try
    XL.ConnectKind := ckNewInstance;
    XL.Connect;
    XL.AutoQuit := False;
    XL.Workbooks.Add('C:\test1.xlsx', 0); //здесь имя тестового файла

    op := (XL.ActiveWorkbook.ActiveSheet as _Worksheet).UsedRange[0].Rows.Count;
    R := XL.Range['D2','D'+IntToStr(op)]; //задаем диапазон поиска
    R := R.Find(np, EmptyParam, xlValues, xlPart, xlByRows, xlNext, False, False, EmptyParam);

    if Assigned(R) then begin //если Excel вернул ссылку на объект R, то все в порядке - найдено
      R.Activate; //устанавливает фокус на ячейку с найденным текстом
      Adr := R.Address[True, True, xlA1, EmptyParam, EmptyParam];
      ShowMessage(Adr);
    end;
    XL.Visible[0] := True;
  finally
    XL.UserControl := True;
    XL.Disconnect;
    FreeAndNil(XL);
  end;
end;
Только применение раннего связывания позволило добиться того что требуется.
Наверное можно получить что надо и при использовании позднего связывания, но, как всегда, после того как получился нужный результат уже нет охоты ковыряться дальше.

Последний раз редактировалось Karabash; 19.08.2010 в 09:04.
Karabash вне форума Ответить с цитированием
Старый 19.08.2010, 08:48   #7
iskurt
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 228
По умолчанию

ёкарный бабай. Спасибо! Дальше буду развивать сам.... смысл понятен
Вот только вот тут не совсем понятно:

Код:
    R := XL.Range['D2','D'+IntToStr(op)]; //задаем диапазон поиска
    R := R.Find(np, EmptyParam, xlValues, xlPart, xlByRows, xlNext, False, False, EmptyParam);
если это у нас XL - то R должно быть Variant, или нет?

Последний раз редактировалось iskurt; 19.08.2010 в 09:49.
iskurt вне форума Ответить с цитированием
Старый 22.08.2010, 05:01   #8
Karabash
Форумчанин
 
Регистрация: 26.07.2009
Сообщений: 216
По умолчанию

В коде недвусмысленно написано: R : ExcelRange;. ExcelRange - это целый класс со своими многочисленными методами, к которым предоставляется доступ к из программ.
Если R будет Variant, то вызвать метод Find не получится. К тому же, метод Find возвращает значение этого же типа (ExcelRange), но с другими значениями.
Если диапазон поиска заданного в первой строке (код ниже), необходимо сохранить для последующего применения, то диапазон ячеек, который вернет Find нужно присвоить другой переменной:
Код:
  ...
  R, RF : ExcelRange;
  ...
    RF := XL.Range['D2','D'+IntToStr(op)]; //задаем диапазон поиска и в следующем операторе он не "затирается".
    R := RF.Find(np, EmptyParam, xlValues, xlPart, xlByRows, xlNext, False, False, EmptyParam);
Karabash вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Формула в Экселе, поиск по значению... Илья Николаевич Microsoft Office Excel 14 15.07.2010 20:10
Можно ли в экселе sershen Microsoft Office Excel 1 08.07.2010 11:56
Диаграммы в Экселе Drakmour Microsoft Office Excel 6 14.03.2010 18:38
уравнение в экселе alex(21) Помощь студентам 2 12.02.2010 16:47
Поиск данных в экселе Ovetomash Microsoft Office Excel 11 20.10.2009 18:25