Форум: "Основная";
Текущий архив: 2004.01.20;
Скачать: [xml.tar.bz2];
ВнизПоиск в 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.011 c