Модераторы: MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Добавление данных с формы в Excel, и наоборот, Не работает :-) 
:(
    Опции темы
ReGeDiT
  Дата 20.6.2008, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код
procedure TForm3.Button2Click(Sender: TObject);
const
  xlCellTypeLastCell = $0000000B; //Метка пустой страницы (вроде как :))
var
  row, col, num: Integer;
  XLApp, Sheet: OLEVariant;
begin

  // Добавление в базу
  Base := CreateOleObject('Excel.Application');
  Base.Visible := False;
  Base.Workbooks.Open(Path+'\DB.xls');
  Base.Activesheet.Cells.Item[1, 1].Value := 'Данные01';
  Base.Activesheet.Cells.Item[2, 1].Value := 'Данные02';
  Base.Activesheet.Cells.Item[3, 1].Value := 'Данные03';
  Base.Activesheet.Cells.Item[4, 1].Value := 'Данные04';
  Base.Activesheet.Cells.Item[5, 1].Value := 'Данные05';
  Base.Activesheet.Cells.Item[6, 1].Value := 'Данные06';
  Base.Activesheet.Cells.Item[7, 1].Value := 'Данные07';
  Base.Activesheet.Cells.Item[8, 1].Value := 'Данные08';
  Base.Activesheet.Cells.Item[9, 1].Value := 'Данные09';  Base.Activesheet.Cells.Item[10, 1].Value := 'Данные10';
  Base.Activesheet.Cells.Item[11, 1].Value := 'Данные11';

  Base.Activesheet.Cells.Item[1, 2].Value := Edit1.Text;
  Base.Activesheet.Cells.Item[2, 2].Value := Edit2.Text;
  Base.Activesheet.Cells.Item[3, 2].Value := Edit3.Text;
  Base.Activesheet.Cells.Item[4, 2].Value := Edit4.Text;
  Base.Activesheet.Cells.Item[5, 2].Value := Edit5.Text;
  Base.Activesheet.Cells.Item[6, 2].Value := Edit6.Text;
  Base.Activesheet.Cells.Item[7, 2].Value := Edit7.Text;
  Base.Activesheet.Cells.Item[8, 2].Value := Edit8.Text;
  Base.Activesheet.Cells.Item[9, 2].Value := Edit9.Text;
  Base.Activesheet.Cells.Item[10, 2].Value := Edit10.Text;
  Base.Activesheet.Cells.Item[11, 2].Value := Edit11.Text;

  Base.Workbooks.Close;

  // Добавление в базу вроде кое-как работает, хотя с её структурой мне ещё надо разбираться, не знаю как лучше её организовать, либо
  // на каждый лист по набору данных, либо всё на одном листе. Дайте совет, если кто может :)

  // Добавление записи журнал (а вот это не работает :( )

  Jrn := CreateOleObject('Excel.Application');
  Jrn.Visible := False;
  Jrn.Workbooks.Open(Path+'\JR.xls'); // Журнал данных
  Sheet := Jrn.Workbooks[Path+'\JR.xls'].WorkSheets[1]; // Ругается на это, пробовал и 0 и 1. Хотя там всего один лист.
  Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;
  Row := Jrn.ActiveCell.Row; // Значение последнего столбца
  Col := Jrn.ActiveCell.Column; // Значение последней строки
  if Jrn.Activesheet.Cells.Item[1, 1].Value = '' then // Если база пустая, ставим номер 1, и добавляем следом данные
  begin
    Jrn.Activesheet.Cells.Item[1, 1].Value := '1';
    Jrn.Activesheet.Cells.Item[Col, Row + 1].Value := Edit2.Text;
    Jrn.Activesheet.Cells.Item[Col, Row + 4].Value := Edit5.Text;
    if Checkbox1.Checked = True then Jrn.Activesheet.Cells.Item[Col, Row + 5].Value := 'Да'
    else Jrn.Activesheet.Cells.Item[Col, Row + 5].Value := 'Нет'
  end
  else
  begin
    Jrn.Activesheet.Cells.Item[Col, Row].Value := Jrn.Activesheet.Cells.Item[Col-1, 1] + 1; // по идее, должен прибавлять к предыдущему номеру +1, но что-то мне очень подсказывает, что оно не работает...
    Jrn.Activesheet.Cells.Item[Col, Row + 1].Value := Edit2.Text;
    Jrn.Activesheet.Cells.Item[Col, Row + 4].Value := Edit5.Text;
    if Checkbox1.Checked = True then Jrn.Activesheet.Cells.Item[Col, Row + 5].Value := 'Да'
    else Jrn.Activesheet.Cells.Item[Col, Row + 5].Value := 'Нет'
  end;


Такой вот код. Помогите пожалуйтса сделать его рабочим, диплом горит smile

Приложение - Как выглядит журнал

Журнал:
Код
-------------------------------------------------------------------------
| # | Дата | Пустое поле | Пустое поле | Краткое содержание | Исполнено |
|------------------------------------------------------------------------
| 1 | 2008 | ----------- | ----------- | О выполнении дел:) | Да        |
| 2 | 2008 | ----------- | ----------- | О невыполнении дел | Нет       |
-------------------------------------------------------------------------


БД:
Код
----------------------
| Данные01 | Текст01 |
| Данные02 | Текст02 |
| Данные03 | Текст03 |
| Данные04 | Текст04 |
----------------------

PM MAIL WWW ICQ   Вверх
Albinos_x
Дата 20.6.2008, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



Цитата(ReGeDiT @  20.6.2008,  20:57 Найти цитируемый пост)
Jrn.Activesheet.Cells.Item[Col, Row].Value := Jrn.Activesheet.Cells.Item[Col-1, 1] + 1; // по идее, должен прибавлять к предыдущему номеру +1,

хм... вообще не поянл чего у Вас не получается... но если здесь хотите делать нуменацию, то забуваете обращаться к .Value , т.е.
Код

Jrn.Activesheet.Cells.Item[Col, Row].Value := Jrn.Activesheet.Cells.Item[Col-1, 1].Value + 1;



--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
ReGeDiT
Дата 20.6.2008, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Здесь очень жутко ругается
Код
Sheet := Jrn.Workbooks[Path+'\JR.xls'].WorkSheets[0];


Код
First chance exception at $7C812A7B. Exception class EOleException with message 'Неверный индекс'. Process Project1.exe (4092)


smile Оба варианта

Код
Sheet := Jrn.Workbooks[Path+'\JR.xls'].WorkSheets[1];


Код
First chance exception at $7C812A7B. Exception class EOleException with message 'Неверный индекс'. Process Project1.exe (2892)



Это сообщение отредактировал(а) ReGeDiT - 20.6.2008, 22:17
PM MAIL WWW ICQ   Вверх
ReGeDiT
Дата 21.6.2008, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



камрады, не уж то, никто не знает? smile
PM MAIL WWW ICQ   Вверх
ReGeDiT
Дата 21.6.2008, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Так, всё заработало, кроме одного момента smile

Jrn.Activesheet.Cells.Item[Col-4, 1].Value := Jrn.Activesheet.Cells.Item[Col-5, 1].Value + 1;

сильно очень ругается на то, что не может перевести OleVariant String в Double

смысл в том, чтобы к предудещему номеру плюсовался ещё 1

1
2
3
4

и т.п., т.е. в первом столбце в последующих строках был номер на единицу больше...

как можно это реализовать?
PM MAIL WWW ICQ   Вверх
ReGeDiT
Дата 22.6.2008, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



ЛЮДИ! Ну неужели никто не знает?
PM MAIL WWW ICQ   Вверх
Albinos_x
Дата 22.6.2008, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



Цитата(ReGeDiT @  20.6.2008,  22:14 Найти цитируемый пост)
Sheet := Jrn.Workbooks[Path+'\JR.xls'].WorkSheets[0];

статью читали: http://forum.vingrad.ru/topic-84634.html ???
там я писал, что отчёт в экселе и в ворде начинается с 1, а не с 0.
Цитата(ReGeDiT @  21.6.2008,  15:36 Найти цитируемый пост)
Jrn.Activesheet.Cells.Item[Col-4, 1].Value := Jrn.Activesheet.Cells.Item[Col-5, 1].Value + 1;

попробуй так:
Код

rn.Activesheet.Cells.Item[Col-4, 1].Value := Integer(Jrn.Activesheet.Cells.Item[Col-5, 1].Value) + 1;



--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
ReGeDiT
Дата 22.6.2008, 23:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Albinos_x @ 23.6.2008,  00:19)
попробуй так:
Код
Jrn.Activesheet.Cells.Item[Col-4, 1].Value := Integer(Jrn.Activesheet.Cells.Item[Col-5, 1].Value) + 1;

Код

Jrn.Activesheet.Cells.Item[Col-4, 1].Value := Integer(Jrn.Activesheet.Cells.Item[Col-5, 1].Value) + 1;


First chance exception at $7C812A7B. Exception class EVariantTypeCastError with message 'Could not convert variant of type (String) into type (Double)'. Process Project1.exe (2272)
PM MAIL WWW ICQ   Вверх
Albinos_x
Дата 15.7.2008, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



хм... а на каком шаге вылетает ошибка ... т.е. чему равен Col...
второе - проверьте, не дописывает ли excel перед вставленными цифрами апостроф (символ  ' ), если так, то предварительно удалите из строки лишние символы, а потом переводите в целочисленное число


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Данкинг
Дата 15.7.2008, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 5
Всего: 130



Цитата(ReGeDiT @  21.6.2008,  16:36 Найти цитируемый пост)
как можно это реализовать? 

Это можно реализовать с помощью обычной переменной, которую наращивать для каждой новой строки. Зачем извращаться таким образом, как в твоём примере? smile А если делать по-твоему, то понятно, что выдаётся ошибка, ты же к строковому типу пытаешься число добавить.




--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Albinos_x
Дата 15.7.2008, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108



Данкинг, я так понимаю, что это вообще в цикле делается... не могу понять почему не используют стандартный счётчик

Добавлено через 22 секунды
может там более хитрая задумка

Добавлено через 27 секунд
)))


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: ActiveX/СОМ/CORBA"

Rrader
Girder

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Delphi
  • Вопросы по SQL и вопросы по базам данных, не связанные с Delphi, задавать здесь

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: ActiveX/СОМ/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.0829 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.