Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.48 MB
Время: 0.011 c
1-63140
miracle_fox
2004-01-07 15:52
2004.01.20
добавить из файла в richedit


3-62996
mev
2003-12-23 13:41
2004.01.20
Помогите с ClientDataSet плз.


6-63284
Novenkij
2003-11-18 01:31
2004.01.20
Пересылка файлов


6-63280
Nikolai_S
2003-11-12 14:48
2004.01.20
mailto:


14-63406
Артём Запаранюк
2003-12-27 16:11
2004.01.20
Обязательно ли хороший программист об. быть хорошим шахматистом





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский