Invalid variant operation ошибка

I have an error in my button click, and I can’t figure out how to resolve it.

This is my code:

if (ovElements.item(i).name = 'add') and    
(ovElements.item(i).type = 'button') and    
(ovElements.item(i).Value = ' + ') then    
ovElements.item(i).Click;

This is the markup:

<td width="20" align="left"><input class="button" style="width: 30px;" 
 name="add" value=" + " onclick="addLvl();" type="button"></td>

And it gives this error:

Invalid Variant Operation Error

What did I do wrong?

Brandon's user avatar

Brandon

68.4k30 gold badges194 silver badges223 bronze badges

asked Aug 14, 2009 at 19:42

2

Just a guess:

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.

answered Aug 14, 2009 at 20:05

Kluge's user avatar

KlugeKluge

3,5573 gold badges24 silver badges21 bronze badges

You can save «ovElements.item(i)» to a local variable and then split your code into multiple line.

obj = ovElements.item(i);
if obj <> nil then
try
  if obj.name = 'add' then
    if obj.type = 'button' then
      if obj.value = ' + ' then    
        obj.click;
except
end;

In this way you can see which line causes this problem.

answered Aug 15, 2009 at 6:08

stanleyxu2005's user avatar

stanleyxu2005stanleyxu2005

8,05114 gold badges58 silver badges93 bronze badges

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.

w5m's user avatar

w5m

2,2863 gold badges34 silver badges46 bronze badges

answered Aug 14, 2009 at 20:03

Lars Truijens's user avatar

Lars TruijensLars Truijens

42.7k6 gold badges124 silver badges141 bronze badges

Причина может быть, например, такого характера:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
uses
  ComObj;
 
var
  Word : Variant;
 
procedure TForm1.Button1Click(Sender : TObject);
begin
  Word := CreateOleObject('Word.Application');
  Word.Visible := True;
end;
 
procedure TForm1.Button2Click(Sender : TObject);
var
  Word : Variant;
begin
  //Далее возникнет ошибка "Invalid variant operation", потому что локальная переменная
  //Word перекрывает одноимённую глобальную переменную. А локальная переменная
  //не инициализирована в данном случае.
  Word.Documents.Open(FileName:='D:Новая папка (2)тест1.doc');
end;

Forrest_1, нужно бОльший участок кода посмотреть. Где объявлена переменная Word? В каком месте выполняются строки, показанные в заглавном посте темы?

И плохо, что имя у переменной — Word. Потому, что этим словом в Delphi назван беззнаковый двухбайтный целочисленный тип. И эта переменная в своей области видимости этот тип перекрывает. Ошибка не по этой причине возникает, но код должен быть построен грамотно и не создавать дополнительных проблем.

Добавлено через 2 минуты
Имя переменной можно поменять, например, на wdApp (сокращение от Word Application).

>
Excel выдает ошибку «Invalid variant operation»

  • Подписаться на тему
  • Сообщить другу
  • Скачать/распечатать тему



Сообщ.
#1

,
16.05.08, 07:00

    Junior

    *

    Рейтинг (т): нет

    Добрый день такая проблема при выполнении в 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’;

    WBk:=Excel.WorkBooks.Open(FileExcel);
    excel.visible:=true;

    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», а чего, понять уже не могу (((
    Прошу вашей помощи, заранее спасибо

    Сообщение отредактировано: bas_sanya — 16.05.08, 07:03


    Romkin



    Сообщ.
    #2

    ,
    16.05.08, 08:05

      Скорее всего в одной из ячеек у тебя не число :)
      Смотри на разделители дробной части.


      Albinos_X



      Сообщ.
      #3

      ,
      18.05.08, 13:08

        Full Member

        ***

        Рейтинг (т): 16

        да и смотри чтоб ячейка не была пустой…


        GeForce



        Сообщ.
        #4

        ,
        02.06.08, 11:09

          На сколько я могу судить по своему опыту ты сдорово портачишь.
          Дело в том что как ни крути 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;

          end;

          Investor. — это типизированная переменная. Все поля в основном string

          function TFunctionBase.GetSheet(i: Integer): Variant; //Получение нужного листа рабочей книги.
          var
          SheetActNow : Sheets;
          begin
          SheetActNow := ExcelWorkbook.Sheets;
          Result := SheetActNow.Item[i];
          end;

          Я работаю через сервера автоматизации. Там методы видны. Пишут, что более универсальный способ.

          Либо есть еще доступ к ячейкам через метод Item[row,Column] помоему свойство листа.


          bas_sanya



          Сообщ.
          #5

          ,
          03.07.08, 05:59

            Junior

            *

            Рейтинг (т): нет

            Спасибо большое,за объяснения, теперь мне все понятно
            спасибо за то что не пожалели времени на написание ответа!!

            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

            0 пользователей:

            • Предыдущая тема
            • Delphi: Система, Windows API
            • Следующая тема

            [ Script execution time: 0,0260 ]   [ 16 queries used ]   [ Generated: 4.06.23, 02:59 GMT ]  

             
            lewka-serdceed
             
            (2008-04-16 15:10)
            [0]

            Извините опять за беспокойство, я опять столкнулся с  Ошибка «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   (16.04.08 15:17) [2]

            Вот же твоя ветка

            http://delphimaster.net/view/2-1208282390/


             
            lewka-serdceed
             
            (2008-04-16 15:49)
            [4]

            в ветке  http://delphimaster.net/view/2-1208282390/
            я разобрался. но здесь то все переменные определены.


             
            Dennis I. Komarov ©
             
            (2008-04-16 15:51)
            [5]

            > [4] lewka-serdceed   (16.04.08 15:49)

            см [1]


             
            Сергей М. ©
             
            (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   (16.04.08 15:55) [7]

            Ну и какой результат ты ожидал от выполнения строки


            > w.ActiveDocument.Tables.item(1).Cell(StringGrid1.RowCount,
            > 1).Borders.item(-1).LineStyle.item(1);

            ?


             
            lewka-serdceed
             
            (2008-04-16 16:04)
            [9]

            w.ActiveDocument.Tables.item(1).Cell(StringGrid1.RowCount,1).Borders.item(-1).LineStyle.item(1);

            А что в этой строке не так?


             
            Сергей М. ©
             
            (2008-04-16 16:10)
            [10]


            > lewka-serdceed   (16.04.08 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).
            или я не правильно тип линии прописываю? подскажите если это так.


             
            Сергей М. ©
             
            (2008-04-16 16:27)
            [15]


            > или я не правильно тип линии прописываю?

            А как тоже самое выглядит в записанном макросе ?


             
            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

            w.ActiveDocument.Tables[1].Cell(1,1).Borders[wdBorderTop].LineStyle := wdLineStyleDouble


             
            Сергей М,
             
            (2008-04-16 18:17)
            [20]


            > ewka-serdceed   (16.04.08 16:45) [16]
            >
            > у меня нет макросов

            У тебя нет , а Ворда есть.

            ты разве не из Ворда этот код содрал бездумно ?)


             
            lewka-serdceed
             
            (2008-04-16 21:02)
            [21]

            uses Word97

            w.ActiveDocument.Tables[1].Cell(1,1).Borders[wdBorderTop].LineStyle := wdLineStyleDouble

            пишет Item не является свойством.

            Подскажите как мне установить тип линии.


            Опытный
            **

            Профиль
            Группа: Участник
            Сообщений: 474
            Регистрация: 7.2.2005

            Репутация: нет
            Всего: 7

            Добрый день! Перешел с Delphi 7 на Delphi XE4-
            Открыл свой старый проект по работе с Excel файлом.
            В Delphi 7 все работало, а вот в Delphi XE4 при работе с файлом выдает ошибку — invalid variant operation

            Уже битый час сижу извращаюсь над котом, а все в пустую. подскажите, как быть.
            Нужно подключит файл Экселя, прочитать значение из ячейки В2 если оно не занято, то вставить туда текст, если оно занято, то проверить В3 и т.д.
            Код нажимаешь на кнопку 1 раз, программа находит пустую ячейку и вставляет туда текст, а вот когда нажимаешь на кнопку второй раз выдает ошибку.
            подскажите, что не так или в Delphi XE4 нужно по другому работать?

            Код

            var
              excelFail:Variant;
              line : string;
            begin
            if PaneExcel.Tag=0
            then begin
              excelFail := CreateOleObject('Excel.Application');
              excelFail.Workbooks.Open(MainPath + 'kniga.xls');
              excelFail.Visible := True;
              PaneExcel.Tag:=1;
            end;
            line:='2';
            While (trim(excelFail.Range['B'+line])<>'') do
                line := IntToStr(StrToInt(line)+1);
            excelFail.Range['B'+line]:='kykyky';

            ВСЕМ СПАСИБО!!! ВОПРОС СНЯТ, ПОТЕРЯЛ ГЛОБАЛЬНУЮ ПЕРЕМЕННУЮ smile

            Это сообщение отредактировал(а) offline — 21.2.2017, 14:59

            Понравилась статья? Поделить с друзьями:
          • Invalid use of property vba ошибка
          • Invalid thread access ошибка фсс
          • Invalid syntax python ошибка как исправить
          • Invalid syntax python ошибка двоеточие
          • Invalid syntax python ошибка while