Модераторы: MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Организация поиска текста в файле Excel 
:(
    Опции темы
Dukalys
Дата 6.9.2010, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 6.9.2010

Репутация: нет
Всего: нет



День добрый. Подскажите каким инструментом Delphi можно организовать поиск в Excel (2007), желательно с примером.

Поиск должен осуществляться ТОЛЬКО по столбцу A Excel, при этом, при нахождении нужного, необходимо записывать данные текущей строки из ячеек B, C в переменные/массив (неважно).
Результатом поиска является МНОЖЕСТВО строк. Хорошо бы если результатом поиска являлись бы строки или конкретные ячейки A101 ...

P.S. Перерыл кучу материала ( в том числе книг), нашёл следующее - 
Ссылка1 - поиск определяет только найдено (true) или ненайдено (false) - а хочется номер ячейки ( лучше строки) - чегото материального.
Ссылка2 - поиск данных на листе, в конце интересный repeat until которого я непонимаю, может через него можно выйти на нужное мне.
Ссылка3 - тоже поиск данных, который резко оканчивается Find().Activate; что этот активейт, куда он что возвращает, для меня загадка.

На вашем форуме почитал темы интересные про работу с Excel, но тем с подробным решением данной задачи так и не нашёл.



Это сообщение отредактировал(а) Dukalys - 6.9.2010, 20:55
PM MAIL   Вверх
Данкинг
Дата 6.9.2010, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 5
Всего: 130



Ну, проходи циклом по листу и ищи, что нужно. Способ медленный, но верный.


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
okkonst
Дата 6.9.2010, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 5.9.2010
Где: Воронеж

Репутация: нет
Всего: 1



а еще лучше - запиши макрос, который бы делал то, что тебе нужно (имеется ввиду - нажми "запись макроса" и соверши нужные действия), а сгенеренный код транслируй в дельфи. Там же отличный поиск есть...
PM MAIL   Вверх
Данкинг
Дата 6.9.2010, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 5
Всего: 130



Цитата(okkonst @ 6.9.2010,  23:34)
а еще лучше - запиши макрос, который бы делал то, что тебе нужно (имеется ввиду - нажми "запись макроса" и соверши нужные действия), а сгенеренный код транслируй в дельфи. Там же отличный поиск есть...

Согласен, это ещё лучше: я сиё предположил, но не стал пока озвучивать.


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Dukalys
Дата 7.9.2010, 06:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 6.9.2010

Репутация: нет
Всего: нет



Ребят спасиб. С макросами я ещё не работал, если честно то даже ммм не представляю что придётся делать. можете это описать как-то. как придётся транслировать ...

А что касается цикла с проверкой каждой ячейки совпадает ли значение (true) то это наверное долго - в файле Excel 200 000 строк. и перебирать в цикле и обращаться к каждой ячейке это жёстко.

P.S. Возможно ли все данные их Excel как-то по-умному рассовать по массивам в Дельфи ? (получается 3 столбца(массива) of String по 200 000) так чтобы вначале программы это заняло секунд 15-20 или меньше. Мне кажется что потом в итоге это съэкономит кучу времени и сил. спасибо за ответы.




Это сообщение отредактировал(а) Dukalys - 7.9.2010, 06:44
PM MAIL   Вверх
Albinos_x
Дата 7.9.2010, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



Цитата(Dukalys @  6.9.2010,  20:50 Найти цитируемый пост)
Ссылка3 - тоже поиск данных, который резко оканчивается Find().Activate; что этот активейт, куда он что возвращает, для меня загадка.

выделяется найденная ячейка

координаты можно получить дав команды в стиле:
Код

column:= ExcelWorksheet1.Columns.Column; 
row:=ExcelWorksheet1.Rows.Row;



--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Dukalys
Дата 7.9.2010, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 6.9.2010

Репутация: нет
Всего: нет



Попробовал ...
Итого - не работает.
подробнее:

Выдержки из первоисточника (книги):

1. "Если задана область ячеек и получена ссылка на неё, то количество столбцов будет определяться свойством Count коллекции Columns объекта Range, а количество строк - свойством Count коллекции Rows объекта Range". Доступ ко всем строкам и столбцам листа рабочей книги предоставляют коллекции Rows и Columns объекта ActiveSheet - активного листа рабочей книги.


2. "Мы определились, что ячейка всегда определяется объектами Range или Cells"

Такая многозначность + отсутствие в Delphi предввода методов, свойств (Excel. пусто) для работы с Excel меня загоняет в тупик.

Код

FindRange := WB.ActiveSheet.Cells.Find(What:=Edit2.Text).Activate; //находит и выделяет

Form1.Edit3.Text := IntToStr(WB.ActiveSheet.Rows.Row); //ролсрой
Form1.Edit4.Text := IntToStr(WB.ActiveSheet.Columns.Column);

Form1.Edit5.Text := IntToStr(WB.ActiveSheet.Cells.Row);
Form1.Edit6.Text := IntToStr(WB.ActiveSheet.Cells.Column);


Во всех эдитах значение = 1   (реальное расположение ПРАВИЛЬНО НАЙДЕННОЙ И ВЫДЕЛЕННОЙ ячейки = 'B3'=(2,3))

Методом подбора - получить какое либо свойство из FindRange (типа Row) так и не получилось.

Выкладываю пример программы - теста, с которой работаю. за основу взята криво написанная (в том числе и мной) программа из нета и неудачно адаптирована под поиск координат ячейки.

прога прикреплена.






P.S. есть у когонить идеи по этому поводу ??? Я в нете коечто нарыл - Ссылко Похоже от туда можно коечто выдернуть, через 2 часика проверю и отпишусь.

Это сообщение отредактировал(а) Dukalys - 8.9.2010, 13:28

Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  pr138_1.zip 394,04 Kb
PM MAIL   Вверх
Albinos_x
Дата 8.9.2010, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



сделай так, это самый простой вариант:
Код
...
 Form1.Edit3.Text := E.ActiveCell.Row;
 Form1.Edit4.Text := E.ActiveCell.Column;
...



--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Dukalys
Дата 8.9.2010, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 6.9.2010

Репутация: нет
Всего: нет



Цитата

...
 Form1.Edit3.Text := E.ActiveCell.Row;
 Form1.Edit4.Text := E.ActiveCell.Column;
...


Оргомное спасибо код работает !!!


Ребят а вот смотрите заметил какую особенность при выполнении метода "Find" для Cells и для Range

Код
 FindRange := WB.ActiveSheet.Cells.Find(What:=Edit2.Text).Activate; 


Выделяет правильную ячейку 3,2

Код
 FindRange := WB.ActiveSheet.Range[Edit1.Text].Find(What:=Edit2.Text).Activate; 


Выделяет 4 ячейку вместо третьей и по выше приведённых свойствам возвращает 4,2

ну наверно можно просто -1 делать от значения Row ? или это особенность какаято ?




Это сообщение отредактировал(а) Dukalys - 8.9.2010, 14:59
PM MAIL   Вверх
Albinos_x
Дата 9.9.2010, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



Цитата(Dukalys @  8.9.2010,  14:36 Найти цитируемый пост)
ну наверно можно просто -1 делать от значения Row ? или это особенность какаято ?

Это если запускать в любой последовательности???


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Dukalys
Дата 9.9.2010, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 6.9.2010

Репутация: нет
Всего: нет



Несовсем догоняю что имеете ввиду здесь про последовательность (начало поиска - с начала документа или конца ?). результат поиска с начала документа - искомой строки, ссылается на последующую строку, вродебы всё время ...
PM MAIL   Вверх
Albinos_x
Дата 13.9.2010, 08:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



хм... у тебя в приложенном проекте, если не ошибаюсь, было 2 кнопки, где реализовано 2-мя способами поиск, вот я и спрашиваю в какой последовательности запускаешь...


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Deeptown12
Дата 26.4.2017, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 5.6.2008

Репутация: нет
Всего: нет



Код

Function FindValueInCell(ExcelWS : TExcelWorksheet; What : string; var CellsFound : TList<TPositionCell>) : Boolean;
var
Found : ExcelRange;
Addr, Addr2 : String;
Position : TPositionCell;
begin
 Result := False;
 //Выполняем поиск в пределах используемого дипазона.
 //Поиск. MatchCase:=False - поиск не зависит от регистра букв.
 // xlPart - по сопадению
 // xlWhole - точное
 Found := ExcelWS.Cells.Find(What, EmptyParam, xlValues, xlWhole, xlByRows, xlNext, False, EmptyParam);
 if Assigned(Found) then
 begin
   Result := True;
   Addr   := Found.Address[True, True, xlA1, EmptyParam, EmptyParam];
   Position.Col  := Found.Column;
   Position.Row  := Found.Row;
   CellsFound.Add(Position);
   repeat
       Found := ExcelWS.Cells.FindNext(Found);
       if Assigned(Found) then
       begin
          Addr2  := Found.Address[True, True, xlA1, EmptyParam, EmptyParam];
          // адрес совпал (круг завершен)
          if SameText(Addr, Addr2) then Break;

          Position.Col  := Found.Column;
          Position.Row  := Found.Row;
          CellsFound.Add(Position);
       end;
   // выход если не найдено
   until not Assigned(Found)
 end;
end;

Procedure Find;
var
 ListCellFound : TList<TPositionCell>;
 I, Row, Col : Integer;
begin
 ListCellFound := TList<TPositionCell>.Create;
 if FindValueInCell(ExcelWS, 'Что искать', ListCellFound) then
 begin
    for I := 0 to ListCellFound.Count-1 do
    begin
        Col := ListCellFound.Items[I].Col;
        Row := ListCellFound.Items[I].Row;
    end;
 end;
 if Assigned(ListCellFound) then FreeAndNil(ListCellFound);
end;

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: ActiveX/СОМ/CORBA"

Rrader
Girder

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Delphi
  • Вопросы по SQL и вопросы по базам данных, не связанные с Delphi, задавать здесь

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: ActiveX/СОМ/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.1550 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.