![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с переменной [D7, WinXP]
Alexey_T-O © (2005-08-04 14:00:00)Код:
var
x:variant;
rez:array [1..100,1..2] of variant;
i:integer;
p:variant;
begin
x:=CreateOleObject('Excel.Application');
x.workbooks.open(ExtractFilePath(ParamStr(0)) +'Test.xls');
x.worksheets[1].Select;
for i:=1 to 100 do
begin
rez[i,1]:=x.worksheets[1].Cells[i,1];
rez[i,2]:=x.worksheets[1].Cells[i,5];
end;
x.quit;
x:=Unassigned;
p:='-1.00 (Glims)'; <<< Как можно отделить -1 от (Glims)?
i:=1;
for i:=1 to 100 do
If rez[i,1]=p then showmessage('OK');
Почему выскакивает ошибка "Invalid variant operations" ? Ведь в ячейках EXCEL'я лежит как текст так и цифры.
P.S.За ранее спасибо.
Alexey_T-O (2005-08-05 13:17:00) [1]Ураа. Работает идеально. Спасибо, всем огромное.
Digitman (2005-08-05 12:30:00) [2]
> evvcom © (05.08.05 12:23) [21]
угу.. упустил .. важное замечание
evvcom (2005-08-05 12:23:00) [3]и rezz:=Unassigned; в finally, а то не отпустится excel
Digitman (2005-08-05 11:25:00) [4]x:=CreateOleObject('Excel.Application');
try
x.workbooks.open(ExtractFilePath(ParamStr(0)) +'test.xls');
x.worksheets[1].Select;
rezz:=x.worksheets[1].Cells[1,1];
p:='1';
if rezz. Value= p then showmessage(rezz. Value);
finally
x.quit;
x:=Unassigned;
end;
Digitman (2005-08-05 10:38:00) [5]
> тут в .. p лежит Unassigned
да быть того не может !
при этом присвоении
p:='-1.00 (Glims)';
VType тут же станет равным varString и более нигде, судя по твоему коду, не меняется
а ниже по тексту ты делаешь проверку
If rez[i,1]=p then
которая при "тут в rez .. лежит Unassigned" , разумеется, приведет к исключению "Invalid variant operations"
Alexey_T-O (2005-08-05 10:24:00) [6]if (TVarData(rez[i,1]).VType = TVarData(p).VType) thenтут в rezи pлежит Unassigned. А до if rez[i,1]=p thenтак и не доходит.
А при Complete true rez = $0015B4FCа p=1и до второй проверки недоходит.
Digitman (2005-08-04 18:03:00) [7]так..
детализируем (учимся отладке) и меняем текст :
if (TVarData(rez[i,1]).VType = TVarData(p).VType) then //что видим здесь (*) ?
if rez[i,1]=p then // что видим здесь, при условии что (*)=True
Alexey_T-O (2005-08-04 18:01:00) [8]Поправил. Ошибку не выдает. Сравнение на работает а при попытке showmessage(rezz) ругается что несоответствие dispatch и string.
можно както перевести Dispatch в String? И что такое Dispatch?
Alexey_T-O (2005-08-04 17:55:00) [9]показывает ошибку "Invalid variant operations"
значения rezz=$0015ccdc а p=123 соответственно.
Digitman (2005-08-04 17:44:00) [10]
> мой расчет был направлен на True..
тьфу ты !
пардон) на False, конечно же ..
иными словами, если условие
TVarData(rez[,1]).VType = TVarData(p).VType
ложно, то нехрена проверять следующее за and условие ...
трассировка пошаговая ЧТО показывает ?
Alexey_T-O (2005-08-04 17:37:00) [11]
var
x:variant;
rezz:olevariant;
p:Variant;
begin
x:=CreateOleObject('Excel.Application');
x.workbooks.open(ExtractFilePath(ParamStr(0)) +'test.xls');
x.worksheets[1].Select;
rezz:=x.worksheets[1].Cells[1,1];
x.quit;
x:=Unassigned;
p:='123';
if (TVarData(rezz).VType = TVarData(p).VType) and (rezz=p) then showmessage(rezz);
end;
Упрощаю вариант. в test.xls в позиции 1,1 пишу "123". Неработает. Complete Boolean Eval=True.
Digitman (2005-08-04 17:17:00) [12]сие поведение сильно зависит от состояния опции "Свойств проекта"
Complete Boolean Eval = ??
мой расчет был направлен нат True..
Alexey_T-O (2005-08-04 17:12:00) [13]if (TVarData(rez[,1]).VType = TVarData(p).VType) and (rezz=p) then
showmessage(rez);ошибка пропала, но showmessageвыводит пустое окно, в любом случае равно rez = p или неравно.
Digitman (2005-08-04 15:28:00) [14]
> как обойти это нулевое значение?
его не надо обходить.
if (TVarData(rez[i,1]).VType = TVarData(p).VType) and (rez[i,1]=p) then ...
Fay (2005-08-04 15:28:00) [15]2 Alexey_T-O (04.08.05 15:22) [7]
Да хоть так
If (VarIsNull(rez[i,1])) then
rez[i,1]=p then showmessage('OK')
Leonid Troyanovsky (2005-08-04 15:25:00) [16]
> Alexey_T-O (04.08.05 14:00)
> rez[i,1]:=x.worksheets[1].Cells[i,1];
Может .Value?
См. VBA Help.
--
Regards, LVT.
Alexey_T-O (2005-08-04 15:22:00) [17]ошибка вылазит при сравнении If rez[i,1]=p thenА как обойти это нулевое значение?
Fay (2005-08-04 15:06:00) [18]2 Digitman © (04.08.05 15:03) [5]
При сравнении строки с null, судя по всему.
If rez[i,1]=p then
Digitman (2005-08-04 15:03:00) [19]
> Fay © (04.08.05 14:52) [4]
> Не критично в д.сл.
Да, не критично, но когда-либо обязательно "выстрелит".
> Alexey_T-O (04.08.05 14:46) [3]
> выскакивает ошибка "Invalid variant operations"
при попытке исполнения КАКОЙ конкретно строчки упомянутого кода ?
Fay (2005-08-04 14:52:00) [20]Digitman © (04.08.05 14:03) [1]
>> Olevariant !!
Не критично в д.сл.