Ошибка invalid variant operation
Пожалуйста, выделяйте текст программы тегом [сode=pas] . [/сode] . Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Соблюдайте общие правила форума
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как «свернуть» программу в трей.
3. Как «скрыться» от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как запустить программу/файл? (и дождаться ее завершения)
5. Как перехватить API-функции, поставить hook? (перехват сообщений от мыши, клавиатуры — внедрение в удаленное адресное прстранство)
. (продолжение следует) .
Внимание:
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка — 60 дней. Последующие попытки — бан.
Мат в разделе — бан на три месяца.
Полезные ссылки:
MSDN Library
FAQ раздела
Поиск по разделу
Как правильно задавать вопросы
Выразить свое отношение к модераторам раздела можно здесь: Rouse_, Krid
Добрый день такая проблема при выполнении в Delphi следующего кода, происходит ошибка «Invalid variant operation»:
var excel: variant;
fileexcel : string;
Wbk: OleVariant;
i: integer;
sum : real;
begin
Excel:=CreateOleObject(‘Excel.Application’);
fileexcel:=’D:\. \Blank_for_sign_test.xls’;
sum:=0;
for i:=1 to 1000 do
if Excel.ActiveWorkBook.WorkSheets[1].Cells[i+1, 4]=Excel.ActiveWorkBook.WorkSheets[2].Cells[2, 2] and
Excel.ActiveWorkBook.WorkSheets[1].Cells[i+1, 5]=1 then
begin
sum:=sum+Excel.ActiveWorkBook.WorkSheets[1].Cells[i+1, 8];
end;
end;
Как я понял не нравиться ему мой «sum», а чего, понять уже не могу (((
Прошу вашей помощи, заранее спасибо
На сколько я могу судить по своему опыту ты сдорово портачишь.
Дело в том что как ни крути Excel реальные данные из ячейки ты ни когда не получишь.
Максимум чего можно достичь это получить объект Range. А вот через него ты можешь читать и писать и вообще делать все что хочешь с ячейкой. В твоем коде отсутсвует после Cells[1,2]. , а далее то что ты хочешь получить. Потому как Cells, если зайти в VBA и посмотреть объектную модель, возращает Range. А вот у него можно уже взять Value т.е. содержимое ячейки.
Т.е. . .Cells[1,2].Value
Вот пример моего метода.
procedure TFunctionBase.SheetInvestorSave(Investor: TInvestorWorking);
var
SheetNow : Variant; //лист рабочей книги
Row : Integer;
begin
SheetNow := GetSheet(1); //Получаю ссылку на лист.
Row := Investor.PersonInvestorData.ExcelProperty.Row;
SheetNow.Cells[Row,1]. Value := Investor.PersonInvestorData.IdentNum;
SheetNow.Cells[Row,2].Value := Investor.PersonInvestorData.FIO.FirstName;
SheetNow.Cells[Row,3].Value := Investor.PersonInvestorData.FIO.NextName;
SheetNow.Cells[Row,4].Value := Investor.PersonInvestorData.FIO.LastName;
SheetNow.Cells[Row,5].Value := Investor.PersonInvestorData.Address.PostIndex;
SheetNow.Cells[Row,6].Value := Investor.PersonInvestorData.Address.City;
SheetNow.Cells[Row,7].Value := Investor.PersonInvestorData.Address.Street;
SheetNow.Cells[Row,8].Value := Investor.PersonInvestorData.Address.House;
SheetNow.Cells[Row,9].Value := Investor.PersonInvestorData.Address.Flat;
SheetNow.Cells[Row,10].Value := Investor.PersonInvestorData.Pasport.Series;
SheetNow.Cells[Row,11].Value := Investor.PersonInvestorData.Pasport.Number;
SheetNow.Cells[Row,12].Value := Investor.PersonInvestorData.Pasport.Getdepartment;
SheetNow.Cells[Row,13].Value := Investor.PersonInvestorData.Pasport.City;
SheetNow.Cells[Row,14].Value := Investor.PersonInvestorData.Pasport.GetDate;
SheetNow.Cells[Row,15].Value := Investor.PersonInvestorData.TelefonContct.Cellular;
SheetNow.Cells[Row,16].Value := Investor.PersonInvestorData.TelefonContct.TelephoneWorke;
SheetNow.Cells[Row,17].Value := Investor.PersonInvestorData.TelefonContct.TelephoneHome;
SheetNow.Cells[Row,18].Value := Investor.PersonInvestorData.Commentary;
Investor. — это типизированная переменная. Все поля в основном string
function TFunctionBase.GetSheet(i: Integer): Variant; //Получение нужного листа рабочей книги.
var
SheetActNow : Sheets;
begin
SheetActNow := ExcelWorkbook.Sheets;
Result := SheetActNow.Item[i];
end;
Я работаю через сервера автоматизации. Там методы видны. Пишут, что более универсальный способ.
Либо есть еще доступ к ячейкам через метод Item[row,Column] помоему свойство листа.
Invalid Variant Operation error
I have an error in my button click, and I can’t figure out how to resolve it.
This is my code:
This is the markup:
And it gives this error:
What did I do wrong?
3 Answers 3
ovElements.item(i).Value is probably a Variant. If a variant contains a null value you will get that error when you compare it to a string.
Make sure ovElements.item(i) doesn’t contain a null value before comparing it.
You can save «ovElements.item(i)» to a local variable and then split your code into multiple line.
In this way you can see which line causes this problem.
It means an operation on a variant which is executed is invalid. This happens, for example, when a variant containing some text is divided by an integer. Clearly this cannot work, but since the compiler can’t check this, it is a runtime error.
Use a temporary variable for the 3 parts in your if statement to see better on which line the error is raised. Then inspect what the values are and what the invalid operation is.
Related
Hot Network Questions
Subscribe to RSS
To subscribe to this RSS feed, copy and paste this URL into your RSS reader.
Site design / logo © 2023 Stack Exchange Inc; user contributions licensed under CC BY-SA . rev 2023.3.16.43320
By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.
Ошибка invalid variant operation
Привет.
Подскажите пожалуйста что я не так делаю в программе! Вот кусок в котором дает программа ошибку: «Проект вызвал исключение класса EvariantInvalidOpError с сообщением Invalid variant operation»:
procedure TForm1.Button1Click(Sender: TObject);
var w,table: variant;
begin
w:=CreateOleObject(«word.application»);
w.visible:=true;
w.Documents.add(«C:\ТЕСТ.doc»);
w.ActiveDocument.Tables.item(1);
Table.Cell(2,1).Range.Text:=Edit1.Text;
end;
Ошибка на строке Table.Cell(2,1).Range.Text:=Edit1.Text;
← →
Johnmen © ( 2008-04-15 22:10 ) [1]
Как видим, table: variant.
Что же тогда значит Table.Cell .
← →
lewka-serdceed ( 2008-04-15 22:36 ) [2]
дак Table.Cell выбор ячейки таблицы. а Что нужно w.ActiveDocument.Tables.Cell
что ли писать?
← →
Johnmen © ( 2008-04-15 22:40 ) [3]
> дак Table.Cell выбор ячейки таблицы
Какой такой таблицы? Мы видим, что переменная table типа variant. И всё.
ПисАть надо думая, что пишешь. Понимая каждую строку кода.
← →
palva © ( 2008-04-15 22:40 ) [4]
> дак Table.Cell выбор ячейки таблицы
Для этого Table должна быть таблицей. А у вас она вариантная переменная, которой ничего не присвоено.
вот придумают средство разработки «сделай то что я хочу, а не то что думаю» вот тогда все заработает, думаю, встроенный в компилятор ИИ, в столь банально бредовом случае сработать должен
← →
Ega23 © ( 2008-04-15 23:35 ) [6]
> в столь банально бредовом случае
Если позволите, то данную фразу возьму на вооружение
Ошибка invalid variant operation
Извините опять за беспокойство, я опять столкнулся с Ошибка «Invalid variant operation». Но все вроде как надо переменная определена и ей присвоена таблица. Я пытаюсь задать стиль линии, у меня появляется опять эта ошибка. Все данные у меня попадают в таблицу, а линии не могу задать.
часть кода:
w:variant;
w.ActiveDocument.Tables.item(1).Cell(StringGrid1.RowCount,1).Borders.item(-1).LineStyle.item(1);
← →
tesseract © ( 2008-04-16 15:14 ) [1]
← →
lewka-serdceed ( 2008-04-16 15:17 ) [2]
нет. В коде w:variant прописано
← →
Сергей М. © ( 2008-04-16 15:43 ) [3]
Вот же твоя ветка
← →
lewka-serdceed ( 2008-04-16 15:49 ) [4]
в ветке http://delphimaster.net/view/2-1208282390/
я разобрался. но здесь то все переменные определены.
← →
Сергей М. © ( 2008-04-16 15:52 ) [6]
> здесь то все переменные определены.
>
И там тоже определены.
Не были бы определены — код не мог бы быть скомпилирован.
А ошибка Invalid variant operation — это ошибка времени выполнения, а не времени компиляции.
Ну раз разобрался, то показывай как ты разобрался ..
← →
lewka-serdceed ( 2008-04-16 15:55 ) [7]
вот полный код. подскажите что не так пожалуйста.
var stroka:integer;
begin
if CheckBox4.Checked=true then begin summa:=0;
w:=CreateOleObject(«word.application»);
w.visible:=true;
w.Documents.add(«C:\Вторая сторона приложения к диплому.doc»);
w.ActiveDocument.Tables.item(1).Cell(StringGrid1.RowCount,1).Borders.item(-1).LineStyle.item(1);
end;end;
← →
Сергей М. © ( 2008-04-16 15:59 ) [8]
Ну и какой результат ты ожидал от выполнения строки
← →
lewka-serdceed ( 2008-04-16 16:04 ) [9]
А что в этой строке не так?
Ты не ответил на вопрос ..
← →
lewka-serdceed ( 2008-04-16 16:14 ) [11]
В строке w.ActiveDocument.Tables.item(1).Cell(StringGrid1.RowCount,1).Borders.item(-1).LineStyle.item(1);
я пытаюсь задать линию верхней грани ячейки таблицы.
← →
Сергей М. © ( 2008-04-16 16:15 ) [12]
> пытаюсь задать линию верхней грани ячейки таблицы
← →
tesseract © ( 2008-04-16 16:17 ) [13]
> нет. В коде w:variant прописано
А ты правильно пропиши. Variant у Delphi и в Com это две разницы.
← →
lewka-serdceed ( 2008-04-16 16:22 ) [14]
w.ActiveDocument.Tables.item(1).Cell(StringGrid1.RowCount,1).Borders.item(-1).LineStyle.item(1);
в документе, который открылся, я нахожу таблицу Tables.item(1) затем ячейку Cell(StringGrid1.RowCount,1), потом определяю какую линию я буду менять (верхнюю) Borders.item(-1), и тип линии LineStyle.item(1).
или я не правильно тип линии прописываю? подскажите если это так.
> или я не правильно тип линии прописываю?
А как тоже самое выглядит в записанном макросе ?
← →
lewka-serdceed ( 2008-04-16 16:45 ) [16]
у меня нет макросов. я просто вставляю из StrinпGrid в готовую таблицу в шаблоне.
← →
lewka-serdceed ( 2008-04-16 16:55 ) [17]
Подскажите мне пожалуйста как мне изменить тип линии в ячейке.
← →
Johnmen © ( 2008-04-16 17:23 ) [18]
> в документе, который открылся, я нахожу таблицу
1. Ты уверен, что желаемый документ «открылся»?
2. Ты уверен, что в документе есть таблица с указанным индексом?
Я это к тому, что за прошедшее с первого поста на эту тему время можно уже было изучить основные принципы и приемы работы с Вордом. В инете примеров, как грязи.
← →
umbra © ( 2008-04-16 18:13 ) [19]
> w.ActiveDocument.Tables.item(1).Cell(StringGrid1.RowCount,
> 1).Borders.item(-1).LineStyle.item(1);
uses Word97
← →
Сергей М, ( 2008-04-16 18:17 ) [20]
> ewka-serdceed (16.04.08 16:45) [16]
>
> у меня нет макросов
У тебя нет , а Ворда есть.
ты разве не из Ворда этот код содрал бездумно ?)
← →
lewka-serdceed ( 2008-04-16 21:02 ) [21]
пишет Item не является свойством.
Подскажите как мне установить тип линии.