Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.01.20;
Скачать: CL | DM;

Вниз

Поиск в Excel   Найти похожие ветки 

 
Asail   (2004-01-08 11:07) [0]

Подскажите как осуществить поиск в Excel.
Бьюсь уже несколько дней!!!
Получается какая-то фигня! (Вот такая)

procedure TfrmMain.btnDHCP_Excel_StartSearchClick(Sender: TObject);
var
exl, WorkBook, Sheet, RetValue : OLEVariant;
FName, S : String;
SheetCount, i, x, y : Integer;
begin
S:=Trim(edtDHCP_Excel_Search.Text);
FName:=CFG.DHCP_Excel_File;
try
exl:=CreateOleObject("Excel.Application");
WorkBook:=exl.WorkBooks.Open(FName);
exl.DisplayAlerts:=False; exl.Visible:=False;
SheetCount:=WorkBook.WorkSheets.Count;
for i:=1 to SheetCount do begin //cheking all sheets
Sheet:=WorkBook.Sheets[i]; Sheet.Activate;
for x:=1 to 3 do //olumns
for y:=1 to 300 do begin //rows
RetValue:=Sheet.Cells.Item[y,x].Value;
if RetValue=S then
memDHCP_Excel_Results.Lines.Add("Found in
sheet: "+Sheet.Name+" in row "+IntToStr(y));
end;
end;
exl.Application.Quit;
except
ShowMessage("Can""t open specified excel file !");
end;
end;

БУДУ ПРЕМНОГО БЛАГОДАРЕН ЗА ЛЮБУЮ ПОМОЩЬ!!!


 
alex_*** ©   (2004-01-08 11:11) [1]

Действительно фигня.... столько строк непонятного кода... текст ошибки привел бы чтоль.


 
Asail   (2004-01-08 12:16) [2]

Проблемы две:
1. Работает ЖУТКО медлненно.
2. Проблема с Variant. При попытке сравнить String с чем-либо
другим дает Exception.
RetValue:=Sheet.Cells.Item[y,x].Value;
if RetValue=S then ...
(надо вернуть любой тип значения ячейки как текст, а как?)


 
Alex_Bredin ©   (2004-01-08 12:46) [3]

1.работает медленно, потому что методы екселевских объектов в цикле вызываешь.
2.используй поиск самого екселя- что мешает?(ускоришь в сотни раз)
3.любой тип значения как текст, как ни странно - cells.text(по-моему)


 
Alex_Bredin ©   (2004-01-08 12:51) [4]

вдогонку - начни запись макроса и выполни поиск средствами екселя,посмотри как это делает сам ексель и переложи код макроса в дельфы - работы на час.


 
Asail   (2004-01-08 13:11) [5]

Не силен я в екселе, а в макросах особенно :-(
Может, кинешь примерчик, а?
Спасибо!


 
Тимохов ©   (2004-01-08 13:15) [6]

Asail (08.01.04 13:11) [5]
[4] хотел сказать, что самый прогрессивный способ изучения ексел это записать макроса с последующим просмотром оного.
Делается это так.
1 В меню сервис жмешь на начало записи макроса.
2 Делаешь то, что тебе нужно
3 Останавливаешь запись
4 Жмешь alt-f11 - попадаешь в редактор visual basic и смотришь как выполнить программно в ексел требуемое тебе действие.
5 Переносишь это в Дельфи

Все.


 
REP ©   (2004-01-08 13:20) [7]

Тимохов © (08.01.04 13:15) [6]
ИМХО, Самый простой способ, с учетом того еще, что в екселе справка по большей части по русски. Лучше день потратить на изучение Екселя (VBA), а потом за час написать, чем лопатить 3 дня Delphi.
Вроде как с чем связываешься, то и надо изучить в первую очередь...


 
Artem03   (2004-01-08 15:52) [8]

1. При поиске средствами Excel"a макросы, почему-то, не создаются.
2. Предлагаю механизм заброски значений ячеек Excel"a в вариантный массив (значения забрасывются одним оператором, а не DataVar[i,j]:=Excel.Cell[i,j].Text)
// RTop,CLeft,RBottom и CRight - границы диапазона в Excel"e
var Excel: OleVariant;
ArrayData: Variant;
Range,CL1,CL2,CR1,CR2: String;

Excel:=CreateOLEObject("Excel.Application");
...
If (CLeft div 26)<1 Then CL1:=""
Else If (CLeft div 26)=1 Then CL1:="z"
Else CL1:=Chr((CLeft div 26)+96);
If (CLeft mod 26)<1 Then CL2:=""
Else CL2:=Chr((CLeft mod 26)+96);
If (CRight div 26)<1 Then CR1:=""
Else If (CRight div 26)=1 Then CR1:="z"
Else CR1:=Chr((CRight div 26)+96);
If (CRight mod 26)<1 Then CR2:=""
Else CR2:=Chr((CRight mod 26)+96);
Range:=CL1+CL2+IntToStr(RTop)+":"+CR1+CR2+IntToStr(RBottom);
// Range - выделяемый диапазон.
// Должен быть ТОЛЬКО В ТИПА "A1:C15"
ArrayData:=VarArrayCreate([CLeft,RTop,CRight,RBottom],varVariant);
ArrayData:=Excel.ActiveSheet.Range[Range].Value;

А дальше работаешь с элементами массива ArrayData.
ArrayData[i,j] работает ЗНАЧИТЕЛЬНО быстрее,
чем Excel.Cell[i,j].Text


 
путник   (2004-01-08 16:16) [9]

Используй команды:
Cells.Find(What:="То что ищем", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
, SearchFormat:=False).Activate
Cells.FindNext(After:=ActiveCell).Activate

Думаю так быстрее получится...


 
Alex_Bredin ©   (2004-01-08 16:39) [10]


> Artem03 (08.01.04 15:52) [8]
> 1. При поиске средствами Excel"a макросы, почему-то, не
> создаются.

ой-ли? специально проверил - это оттуда

Cells.Find(What:="lotus", After:=ActiveCell, LookIn:=xlFormulas, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
False, SearchFormat:=False).Activate


 
k-129_rro   (2004-01-08 21:45) [11]

Из моей программы, разберешься (главное смысл):

procedure TForm1.Button7Click(Sender: TObject);

begin
ExcelApp:=createoleobject("Excel.application");
ExcelWb:=ExcelApp.Workbooks.Open(path);
ExcelWs:=ExcelWb.Worksheets.item[1];
form1.Button6.Enabled:=true;
form1.Button9.Enabled:=true;
form1.ComboBox2.Enabled:=true;
form1.Edit6.Enabled:=true;

k:=1;
j:=3;
while k<>200 do begin
str:=ExcelWs.cells.item[k,j];
s:=str;
if s="mm_smX1upor" then
begin
for i:=k to k+3 do begin
j:=2;
str:=ExcelWs.cells.item[k,j];
s:=str;
form1.ComboBox2.Items.Add(s);
k:=k+1;
end;
end;
k:=k+1;
end;
form1.Button7.Enabled:=false;
end;


 
Asail   (2004-01-09 23:22) [12]

Спасибо [8] Artem03! Все отлично работает.
Метод k-129_rro тоже ничего, только в моем случае черезчур
медленный. Циклический вызов функций екселя, видимо, сказывается.
Таблицы у меня больно здаровые - порядка 150 страниц, на каждой
по 10-20 колонок и 200-500 строк.

Только есть еще один момент:
как узнать последнюю заполненную колонку/строку на листе?


Еще раз спасибо!!!



Страницы: 1 вся ветка

Текущий архив: 2004.01.20;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.016 c
6-63292
nonameoo
2003-11-17 21:20
2004.01.20
скопировать ехе-шник


14-63395
DelphiN!
2003-12-28 14:58
2004.01.20
Абсолютно бесплатный хостинг на .com .net .org


1-63214
Fast
2004-01-09 14:59
2004.01.20
RichEdit


3-62992
kiko
2003-12-23 14:42
2004.01.20
Помогите с RESTORE, плиз!!!!


1-63089
andrey__
2003-12-30 13:57
2004.01.20
TServiceApplication