![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
поиск ячеек по excel файлам [D6, WinXP]
kate158 © (2009-09-22 16:03:00)что делаю:1.ищу excel файлы в папке (их названия у меня в мемо).2.нахожу опр ячейку по всем эксель файлам(ее адрес введен на форме в эдит поле).3. копирую название файла и значение ячейкив блокнот. вопрос таков. что неверно написано в коде (поиск ячейки по всем файлам):
procedure TForm1.Button3Click(Sender: TObject);
var
D1, D2 : Variant;
E, W, SB,SH : Variant;
i:integer;
BEGIN
E := CreateOleObject('Excel.Application');
E.DisplayAlerts := False;
for i:=0 to Memo1.Lines.Count - 1 do
E.WorkBooks.Open(trim(Memo1.Lines[i]), ReadOnly:=True);
W := E.WorkBooks.Item[1];
SH := W.Sheets.Item[1];
D1 := SH.Range[EditAA.Text].Value;
i:=i+1;
showmessage(d1);
//E.Visible:=true;
e.WorkBooks.close;
Application.ProcessMessages;
end;
цикл по файлам работает, на данным из ячейки нет..не могу догнать в чем ошибка
Thrashead (2009-09-24 15:01:00) [1]Наздоровье :)
Ещё интересные задачки будут?
kate158 (2009-09-24 14:54:00) [2]Сергей М.спасибо!
Thrasheadспасибо! код - то, что нужно.
:)
Thrashead (2009-09-24 13:42:00) [3]хммм... опечатка. "сиДя на работе".
Thrashead (2009-09-24 13:41:00) [4]сейчас, силя на работе, наваял кусок кода.
протестировано в fastreport.
много букв, т.к. сделаны некоторые проверки на возможные ошибки в строке.
+обрабатывает excel'евские AA,AB, AZ, AAA и т.п.
знаю, что в экселе нет AAA (IV предел) - но сделал универсально.
применимо только к строкам с двоеточием (см. код).
хз что ещё добавить.
вроде работает.
Thrashead (2009-09-24 13:36:00) [5]function FunctionX(s: String): String;
var
i, p, n1, n2: Integer = 0;
t, t1, t2, t11, t21, t3: String = '';
procedure GetParts(a: String; var b: String; var c: Integer);
var
j: Integer = 0;
FDP: Integer = 0; // First Digit Position
tt: String = '';
begin
b:='';
c:=0;
if a<>'' then
for j:=1 to Length(a) do
if a[j] in ['0'..'9'] then
if FDP=0 then FDP:=j;
if FDP>1 then
begin
b:=Copy(a,1,FDP-1);
try
c:=StrToInt(Copy(a,FDP,Length(a)-FDP+1));
except
end;
end;
end;
function GetNextLetters(a: String): String;
var
tt: String;
j: Integer;
IncLetter: Boolean = True;
begin
tt:=UpperCase(a);
Result:=tt;
for j:=Length(tt) downto 1 do
begin
if IncLetter then
if tt[j] in ['A'..'Z'] then
if tt[j]='Z' then
begin
Result[j]:='A';
if j=1 then Result:='A'+Result;
end
else
begin
Result[j]:=Chr(Ord(Result[j])+1);
IncLetter:=False;
end;
end;
end;
begin
Result:='';
p:=Pos(':',s);
if (p>0) and (p<Length(s)) then
begin
t:=UpperCase(s);
t1:=Copy(t,1,p-1);
t2:=Copy(t,p+1,Length(t)-p);
if (t1<>'') and (t2<>'') then
begin
GetParts(t1,t11,n1);
GetParts(t2,t21,n2);
// TEST Result:=t1+'-'+t11+'-'+IntToStr(n1)+' / '+t2+'-'+t21+'-'+IntToStr(n2);
if (t11<>'') and (t21<>'') and (n1>0) and (n2>0) and (n1<=n2) then
if (t11<t21) then
begin
t3:=t11;
i:=n1;
while t3<>t21 do
begin
for i:=n1 to n2 do
Result:=Result+t3+IntToStr(i)+',';
t3:=GetNextLetters(t3);
end;
for i:=n1 to n2 do Result:=Result+t21+IntToStr(i)+',';
Result:=Copy(Result,1,Length(Result)-1);
end;
if (t11=t21) and (n1<n2) then
begin
for i:=n1 to n2 do Result:=Result+t11+IntToStr(i)+',';
Result:=Copy(Result,1,Length(Result)-1);
end;
end;
end;
end;
procedure Button1OnClick(Sender: TfrxComponent);
begin
Edit1.Text:=FunctionX('a1:aaa3');
end;
Сергей М. (2009-09-24 13:36:00) [6]
> это будет завтра
В смысле ?)
kate158 (2009-09-24 13:28:00) [7]>[38]
читала.это будет завтра.))
Сергей М. (2009-09-24 12:44:00) [8]Ты [33] читала ?)
Сергей М. (2009-09-24 12:41:00) [9]
> у самой
А, ну да .. Миль пардон)
"Ах, графиня, на что Вам судьбина жестокая ?" (С) МВ
> 2.одно поле едит.искать символ ":"
Угу.
> может выцеплять число и по нему циклом идти
Угу.
kate158 (2009-09-24 12:35:00) [10]у самой (:))) мысли есть. но хочу других.
значит, так:
1.кинуть на форму 4 едита и забивать адреса ячеек вручную. типа такого:
Edit1.Text+Edit2.Text+':'+Edit3.Text+Edit4.Text
далее цикл по Edit2 и Edit4..
2.одно поле едит.искать символ ":" типа
If Pos(':',Edit1.Text)<>0 then, вот что далее пока мысль не идет. тоже может выцеплять число и по нему циклом идти..
может что еще можно придумать..
Сергей М. (2009-09-24 11:49:00) [11]
> kate158 © (24.09.09 11:16) [34]
У самого-то хоть какие-нибудь мысли на сей счет есть ?
Тривиальная же задача ..
kate158 (2009-09-24 11:16:00) [12][31]
собственно, как "превратить"
F3:F8
в
F3, F4, F5, F6, F7, F8
?
Сергей М. (2009-09-23 14:25:00) [13]
> Анализ строки не так уж сложен
Можно даже вообще ничего не анализировать.
Просто пока не поздно согласовать с Заказчиком предложение по изменению ТЗ в части способов указания юзером интересующих его диапазонов.
Вряд ли юзер будет против варианта интерактивного выбора интересующих его ячеек или диапазонов прямо на листе рабочей книги, вместо тупого набивания координат в Еdit'е.
Thrashead (2009-09-23 14:16:00) [14]kate158:
не сомневаюсь, это будет Великая Программа. Спрашивал-то не про конкретную функцию работы с Excel, а в целом: что за проект, для чего и т.д. Для общего представления, о чём идёт речь.
Совет по ТЗ.
Составили, утвердили - и только потом программирование.
Если у заказчика Просветление - все изменения в следующей версии, билде и т.п. Желательно.
По поводу ввода адресов ячеек.
См. пост [14]. Мне кажется, осуществимо. Анализ строки не так уж сложен.
+ пост [31] - тоже не сложно.
Сергей М. (2009-09-23 11:45:00) [15]
> F3:F8
Ты не знаешь как "превратить"
F3:F8
в
F3, F4, F5, F6, F7, F8
?
Или где ?)
Сергей М. (2009-09-23 11:43:00) [16]Нафих, спрашивается, нужно такое ТЗ, которое меняется по чьему-то сиюсекундному капризу ?)
Да и проблемы-то что-то не видно)
kate158 (2009-09-23 11:40:00) [17]проблемы появляются с изменениями пунктов тз в ходе создания кода.. ))
Сергей М. (2009-09-23 11:30:00) [18]Ты же сказал что проблем нет ?)
kate158 (2009-09-23 11:08:00) [19]как можно это все упростить? может на форму кинуть эдиты для фиксированного ввода ячеек?
kate158 (2009-09-23 11:07:00) [20]блин. тут еще добавилась тема. пользователь может ввести диапазон как D1,G4,F3:F8...