
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.75] |
![]() |
|
Сообщ.
#1
,
|
|
|
Добрый день такая проблема при выполнении в 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", а чего, понять уже не могу ((( Прошу вашей помощи, заранее спасибо |
Сообщ.
#2
,
|
|
|
Скорее всего в одной из ячеек у тебя не число
![]() Смотри на разделители дробной части. |
Сообщ.
#3
,
|
|
|
да и смотри чтоб ячейка не была пустой...
|
Сообщ.
#4
,
|
|
|
На сколько я могу судить по своему опыту ты сдорово портачишь.
Дело в том что как ни крути 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] помоему свойство листа. |
Сообщ.
#5
,
|
|
|
Спасибо большое,за объяснения, теперь мне все понятно
спасибо за то что не пожалели времени на написание ответа!! |