Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.05.2017, 17:09   #1
Stepan_P
Пользователь
 
Регистрация: 17.12.2015
Сообщений: 14
По умолчанию Связь Delphi и Excel

Добрый день! Программисты, знающие Delphi, помогите пожалуйста.
Не получается решить проблему, она такова:
На форме расположены компоненты "ComboBox1_count", "Edit_time" и "Edit1_predmet". При выборе определенного значения в ComboBox1_count (например "1"), в поле "Edit_time" выводится соответствующее значение времени звонков (оно для справки пользователю), а записанный в поле "Edit1_predmet" учебный предмет заносится в соответствующую ячейку Excel. Но при выборе какого-либо значения в поле "ComboBox1_count" Delphi выдает ошибку: Invalid variant operation
Когда удаляю строку temp.Range['E10'] := Form1_week.Edit1_predmet.Text; и все остальные аналогичные, то ошибка не выходит, а необходимо эти два поля связать между собою.
Код процедуры:

Код:
procedure TForm1_week.ComboBox1_countChange(Sender: TObject);
begin
  if ComboBox1_count.Text='1'
    then begin
      Edit_time.Text := '8:00-8:45, 8:50-9:30';
      temp.Range['E10'] := Form1_week.Edit1_predmet.Text;
    end

  else if ComboBox1_count.Text='2'
    then begin
      Edit_time.Text := '10:00-10:45, 10:50-11:30';
      temp.Range['E12'] := Form1_week.Edit1_predmet.Text;
    end

  else if ComboBox1_count.Text='3'
    then begin
      Edit_time.Text := '12:00-12:45, 12:50-13:30';
      temp.Range['E14'] := Form1_week.Edit1_predmet.Text;
    end

  else if ComboBox1_count.Text='4'
    then begin
      Edit_time.Text := '14:00-14:45, 14:50-15:30';
      temp.Range['E16'] := Form1_week.Edit1_predmet.Text;
    end

  else if ComboBox1_count.Text='5'
    then begin
      Edit_time.Text := '15:50-16:35, 16:40-17:20';
      temp.Range['E18'] := Form1_week.Edit1_predmet.Text;
    end

  else if ComboBox1_count.Text='6'
    then begin
      Edit_time.Text := '17:40-18:25, 18:30-19:10';
      temp.Range['E20'] := Form1_week.Edit1_predmet.Text;
    end

  else if ComboBox1_count.Text='7'
    then begin
      Edit_time.Text := '19:20-20:05, 20:10-20:50';
      temp.Range['E22'] := Form1_week.Edit1_predmet.Text;
    end;
_____
Код программы нужно выделять (форматировать) тегами [CODE] (читать FAQ)
Модератор
Изображения
Тип файла: jpg Расписание.JPG (54.4 Кб, 44 просмотров)

Последний раз редактировалось Serge_Bliznykov; 29.05.2017 в 17:18.
Stepan_P вне форума Ответить с цитированием
Старый 30.05.2017, 01:39   #2
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Попробуйте так:
Код:
temp.Range['E22', EmptyParam] := Form1_week.Edit1_predmet.Text;
Ship_1 вне форума Ответить с цитированием
Старый 30.05.2017, 11:29   #3
Stepan_P
Пользователь
 
Регистрация: 17.12.2015
Сообщений: 14
По умолчанию

Спасибо, но нет, не получается( Выходит та же самая ошибка
Stepan_P вне форума Ответить с цитированием
Старый 30.05.2017, 11:54   #4
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Код:
Var
  XArr: Variant;
begin
  XArr:=VarArrayCreate([1,1,varVariant);
  ...
  XArr[1] := Form1_week.Edit1_predmet.Text;
  temp.Range['E22', 'E22'].Value := XArr;
  ...
end;
Ячейка ёкселя - такой же объект, у неё масса свойств (например, Font, Color, Selected). Как программа без указания конкретного пропертоса определит, что именно Вы в ячейке меняете - может быть, цвет фона или шрифта?

Кроме того, Range предполагает работу с диапазона, и одинокая ячейка в него тоже передаётся диапазоном.
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...

Последний раз редактировалось Sciv; 30.05.2017 в 12:00.
Sciv вне форума Ответить с цитированием
Старый 30.05.2017, 12:03   #5
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Sciv Ну как-как... По умолчанию принимает, как "измени текстовое значение этой ячейки". У меня прокатывает (D7, COM-подключение, если ничего в названии последнего не путаю, хотя вполне могу). Value, если я правильно понял из экспериментов, уже работает как вставка значения. Так не помню (код дома), но, возможно, принимает и числа. В любом случае тип ячейки меняет под тип вводимых данных (с соответствующими выравниваниями по-умолчанию, округлениями и т.п.).
Цитата:
Кроме того, Range предполагает работу с диапазона, и одинокая ячейка в него тоже передаётся диапазоном.
Как и с предыдущим - у меня нормально понимает, что если указан не диапазон, то это одна ячейка. Я к одиночным ячейкам только так и обращаюсь.

Последний раз редактировалось Ship_1; 30.05.2017 в 12:10.
Ship_1 вне форума Ответить с цитированием
Старый 30.05.2017, 12:08   #6
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
COM-подключение
Всё так, OLEObject

Цитата:
В любом случае тип ячейки меняет под тип вводимых данных (с соответствующими выравниваниями по-умолчанию, округлениями и т.п.).
Вот тут и есть пичалька: в Экселе ячейка может хранить любой тип данных. В дельфи объект "Ячейка" тоже, соответственно, должен хранить любой тип. Для этого значение ячейки и объявлено как Variant.

Естественно, дельфа позволяет преобразовать произвольный тип в Variant, но если ты работаешь непосредственно с ячейкой. ТС работает с Range - то есть диапазоном ячеек. Сам понимаешь, одиночное значение диапазону не передашь. Поэтому приходится юзать VariantArray.

PS. На самом деле когда я ещё писал программы - я использовал оба способа обращения к экселевским ячейкам, но тот который я предложил, у меня ни разу не стрелял, в отличие от прямой записи в ячейку. И я, кстати, так и не разобрался, почему оно то стреляет, то не стреляет...

PPS. Да, кстати, можно же вроде бы ещё и с ячейкой и работать:

Код:
temp.Cells[5, 22] := Form1_week.Edit1_predmet.Text;
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...

Последний раз редактировалось Sciv; 30.05.2017 в 12:17.
Sciv вне форума Ответить с цитированием
Старый 30.05.2017, 12:21   #7
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Не-не, в данном случае я ячейкой назвал одноячеечный диапазон как раз Как у ТС
Код:
temp.Range['E18']
Дома специально вчера, вроде, код смотрел. Я именно так данные и записываю (не часто же нужно одно и то же значение во множество ячеек внести). Практически оттуда и скопировал то, что в квадратных скобках. Только заменил функцию обработки двух чисел в букву на конкретное значение... Хм... Что ж я, криво посмотрел, что ль?... Жаль, код не с собой.
Может, там обработка при выполнении команды экселем: если длинна массива ячеек не 2, а 1, то последняя равна первой

Последний раз редактировалось Ship_1; 30.05.2017 в 12:26.
Ship_1 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Связь Delphy и Excel Cherlenina Помощь студентам 8 29.11.2010 04:33
связь строк в excel loveless Microsoft Office Excel 1 17.03.2010 16:50
Связь с Excel Foxx Microsoft Office Word 2 14.03.2010 21:08
Связь Word и Excel kinogruppa Microsoft Office Excel 4 28.09.2009 22:57
Связь Excel и Access Top Microsoft Office Excel 3 29.04.2009 16:07