0 / 0 / 0
Регистрация: 07.02.2012
Сообщений: 40
1

Работа с Excel (формулы) в Delphi

03.07.2014, 08:20. Показов 9804. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день!
Нужна ваша помощь знатоки! )
Есть шаблон документа, я его заполняю и делаю копию. В этом документе есть несколько листов.
И нужно что одни ячейки листа А были ровны ячейкам листа В. все вроде бы просто!!!!)
Для этого использовал формулы типа:
1) =ЕСЛИ(B!AD9<>"";B!AD9;"")
и
2) =СЦЕПИТЬ(B!AD9)
Пришлось их, т.к. если писать просто (=B!AD9), получаю ноль, заполняемая ячейка будет пуста.
Но пошли проблемы!!! Когда копирую из шаблона листы
Delphi
1
WorkSheet1.WorkSheets[1].Copy(After:=WorkSheet2.WorkSheets[1]);
...
...
формулы теряются (((
Если пытаюсь cоpдать формулу из Delphi в Excel, используя первую формулу:
Delphi
1
WorkSheet2.WorkSheets[2].Cells[13,10].Formula:= '=ЕСЛИ(Z!AD9<>"";Z!AD9;"")';
грязно ругается!!!
Если пытаюсь cоpдать формулу из Delphi в Excel, используя вторую формулу:
Delphi
1
WorkSheet2.WorkSheets[2].Cells[13,10].Formula:= '=СЦЕПИТЬ(Z!AD9)';
не ругается. Но в ячейке стоит #ИМЯ?, нужно зайти в ячейку и нажать Enter что отработала формула.
Как победить это дело нужно чтобы при заполнении B, А становилось равно B и всего!!!
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.07.2014, 08:20
Ответы с готовыми решениями:

Excel+Delphi - вставка формулы
Здравствуйте, подскажите как в Delphi посчитать сумму начиная с определенной ячейки(D12) до...

Перевод Excel формулы в Delphi
Всем привет. Не понимаю как написать экселевскую формулу в делфи. В3=ATAN2(14*(A2-A1) /...

Запись формулы в MS Excel из под Delphi
Добрый день, уважаемые форумчане))) Использую раннее связывание. При попытке записать формулу в...

Работа с Excel: как получить результат выполнения формулы
Добрый день. Подскажите как получить результат выполнения формулы .Изначально есть лист с данными ...

6
13107 / 5888 / 1707
Регистрация: 19.09.2009
Сообщений: 8,808
03.07.2014, 09:37 2
Лучший ответ Сообщение было отмечено Z-7000 как решение

Решение

Цитата Сообщение от Z-7000 Посмотреть сообщение
Для этого использовал формулы типа:
1) =ЕСЛИ(B!AD9<>"";B!AD9;"")
и
2) =СЦЕПИТЬ(B!AD9)
Достаточно формулы №1.
Цитата Сообщение от Z-7000 Посмотреть сообщение
Когда копирую из шаблона листы
WorkSheet1.WorkSheets[1].Copy(After:=WorkSheet2.WorkSheets[1]);
...
...
формулы теряются (((
Выполнение первой строки не приводит к потере формул. Значит, где-то дальше в коде формулы затираются.
Цитата Сообщение от Z-7000 Посмотреть сообщение
Если пытаюсь cоpдать формулу из Delphi в Excel, используя первую формулу:
WorkSheet2.WorkSheets[2].Cells[13,10].Formula:= '=ЕСЛИ(Z!AD9<>"";Z!AD9;"")';
грязно ругается!!!
Если формула устанавливается программно, то она должна быть записана в варианте для английского языка:
Код
=IF(B!AD9<>"";B!AD9;"")
Цитата Сообщение от Z-7000 Посмотреть сообщение
WorkSheet2.WorkSheets[2].Cells[13,10].Formula:= '=СЦЕПИТЬ(Z!AD9)';
не ругается. Но в ячейке стоит #ИМЯ?, нужно зайти в ячейку и нажать Enter что отработала формула.
Как выше уже упоминалось - в случае программной записи формулы надо задавать в варианте для английского языка. После записи формул надо или выполнить перерасчёт отдельного листа:
Delphi
1
WorkSheetNew.Calculate;
или перерасчёт всех открытых рабочих книг - на случай, если на других листах есть формулы, связанные текущим листом:
Delphi
1
exApplication.Calculate;
---
В общем, надо разобраться с кодом, который идёт после строки:
Delphi
1
WorkSheet1.WorkSheets[1].Copy(After:=WorkSheet2.WorkSheets[1]);
Потому, что выполнение самой этой строки не приводит к потере формул.

Добавлено через 19 минут
Цитата Сообщение от Mawrat Посмотреть сообщение
После записи формул надо или выполнить перерасчёт отдельного листа:
Вернее, лучше так - если формул много, то перед их записью надо отключить режим автоматического пересчёта. А после записи всех формул, вновь включить автоматический пересчёт:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
const
  xlManual = -4135;
  xlAutomatic = -4105;
var
  exApp : OleVariant;
...
begin
...
  exApp.Calculation := xlManual; //Переключение на режим ручного пересчёта.
  //Запись формул в ячейки.
  ...
  exApp.Calculation := xlAutomatic; //Вновь включаем автоматический пересчёт.
2
0 / 0 / 0
Регистрация: 07.02.2012
Сообщений: 40
04.07.2014, 03:41  [ТС] 3
Большое спасибо за такой прекрасный ответ.
Совершенно верно, что нужно писать все функции на английском языке ) я не обратил внимания.
Тут еще я допустил ошибку:
Delphi
1
=IF(B!AD9<>"";B!AD9;"")
Excel использует в формуле ";" - точку с запятой, но для Delphi это ошибка, нужна просто запятая:
Delphi
1
=IF(B!AD9<>"",B!AD9,"")
В Excel уже будет все как нужно!
И точно, копирование не удаляет формулы, это я затирал формулы в процессе заполнения листов.!!!
И получается что цифры:
Delphi
1
2
  xlManual = -4135;
  xlAutomatic = -4105;
это диапазон строк в котором происходит перерасчет?
0
13107 / 5888 / 1707
Регистрация: 19.09.2009
Сообщений: 8,808
04.07.2014, 08:45 4
Цитата Сообщение от Z-7000 Посмотреть сообщение
Excel использует в формуле ";" - точку с запятой, но для Delphi это ошибка, нужна просто запятая:
Правильно. Только это не в Delphi дело. Это в Excel такая особенность записи формул через программу - что аргументы надо разделять запятой, а не точкой с запятой.
Цитата Сообщение от Z-7000 Посмотреть сообщение
И получается что цифры:
Delphi
1
2
  xlManual = -4135;
  xlAutomatic = -4105;
это диапазон строк в котором происходит перерасчет?
Это константы, с помощью которых задаётся режим перерасчёта формул. Если мы пишем так:
Delphi
1
2
//Здесь exApp ссылается на интерфейс корневого объекта Excel - Excel.Application.
exApp.Calculation := xlAutomatic;
то включается автоматический режим перерасчёта. В этом случае каждый раз, когда мы записываем формулу в ячейку, Excel выполняет перерасчёт. Этот режим чаще всего задействован по начальным установкам.
А если мы пишем так:
Delphi
1
2
//Здесь exApp ссылается на интерфейс корневого объекта Excel - Excel.Application.
exApp.Calculation := xlManual;
то Excel не будет автоматически выполнять расчёты по формулам. Расчёт будет выполнен, только, если вызвать метод exApp.Calculate (если exWorkSheet.Calculate для пересчёта отдельного листа). Это бывает полезно, когда на листы надо записать большое количество формул - чтобы Excel во время этого процесса не выполнял перерасчёты.
0
0 / 0 / 0
Регистрация: 07.02.2012
Сообщений: 40
04.07.2014, 09:38  [ТС] 5
Все предельно ясно )
И еще один маленький вопрос, больше относящийся к Excel.
Есть ячейка с текстом и если текст в ней подчеркнут, то другая ячейка становилась ей ровна.
что-то типа
Код
=IF(лист!N83Font.Underline=true,лист!N83,"")
а найти пример не могу (
0
13107 / 5888 / 1707
Регистрация: 19.09.2009
Сообщений: 8,808
04.07.2014, 10:38 6
Вот с этим разбираться надо - возможно ли такое сделать через формулу? А через программу сделать можно - написать код, который будет проверять свойства шрифта.
0
0 / 0 / 0
Регистрация: 07.02.2012
Сообщений: 40
04.07.2014, 11:04  [ТС] 7
) Да через программу это легко согласен.!
Но просто программа отработала, а есть необходимость редактировать данные в Excel и только в одном листе,
а в остальных автоматом изменяются значения.
Ладно, буду думать) если у вас есть идеи пишите, буду рад.!

Еще маленький вопрос уже программный, Excel открывается нормально, но почему-то за формой программы, такое заметил с в десятом Excel. Как заставить его открываться поверх, всех окон и в развернутом виде, а не маленьким прямоугольником, что тоже бывает.!.?
0
04.07.2014, 11:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.07.2014, 11:04
Помогаю со студенческими работами здесь

Работа с Excel в Delphi.
Еще раз здравствуйте, уже весь день ломаю голову над такой штукой: я работаю с xlm файлом, я из...

Работа с Excel в Delphi
Нужна программа для открытия любой книги Excel в Delphi а затем редактирование книги. Если кто...

Работа с Excel из Delphi
есть функция, которая считывает из TStringGrid в файл Excel и сохраняет. нужно, чтобы считывало...

Работа c Excel через delphi
Здравствуйте. Есть 2 вопроса: как указать не имя листа, а имя файла; как прописать путь для...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru