Delphi и Excel (проблема с пересчётом формул)

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
Gray[cLmT]
Сообщения: 8
Зарегистрирован: 18 мар 2009, 07:06

Доброго дня!
Прошу помощи... у меня следующая ситуация:
я из Delphi записываю в ячейку формулы:

Код: Выделить всё

Excel.WorkBooks[1].WorkSheets[1].Cells[i, 6].Formula:='=F'+IntToStr(i-1)+'/J'+IntToStr(i-1);
Excel.WorkBooks[1].WorkSheets[1].Cells[i, 7].Formula:='=G'+IntToStr(i-1)+'/J'+IntToStr(i-1);
Excel.WorkBooks[1].WorkSheets[1].Cells[i, 8].Formula:='=H'+IntToStr(i-1)+'/J'+IntToStr(i-1);
Excel.WorkBooks[1].WorkSheets[1].Cells[i, 9].Formula:='=I'+IntToStr(i-1)+'/J'+IntToStr(i-1);
и у меня в итоге в этих ячейках получается содержимое: '#ИМЯ?' т.е. там данные не пересчитаны. Пробывал просто «пересчитать формулы» в Excel комбинацией клавиш Shift+F9 не получается, подскажите пожалуйста может есть какая-то команда для этого и если есть возможность пришлите пожалуйста какой-нибудь пример, от которого можно оттолкнуться.
Заранее премного благодарен!
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

#ИМЯ - это не текст в формуле, а результат вычисления. Встаньте в ячейку, нажмите F2 и посмотрите что реально записалось в ячейку. Подозреваю, что там "=F 2/J 2". Т.е. значение с пробелами! Если это так, то делайте Trim(IntToStr(...))

Кроме того, изучите как работают формулы со ссылками в силе R1C1. Используя их вы можете вообще обойтись без циклов, записав множество формул одной командой.
Gray[cLmT]
Сообщения: 8
Зарегистрирован: 18 мар 2009, 07:06

Naeel, проблема не из-за пробелов, и в ячейку записывается рабочая формула, встав на неё и нажав F2 - появляется "=F2/J2" и после того как я нажимаю ентер, формула пересчитывается и в данной ячейке появляется нужный результат. Меня интересует, есть ли команда для пересчёта всех формул страницы, что-то типо

Код: Выделить всё

Excel.WorkBooks[1].WorkSheets[1].Application.CalculateFull;
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Пересчет тут не поможет однозначно. После F2, Enter происходит не пересчет, а переввод. Для Excel это две большие разницы.
Т.е. имена J2, F2 почему-то в первый раз не опознаются как имена ячеек. А второй раз (уже из самомго Excel) все прокатывает.

Попробуйте
- из Вашей программы ввести формулу '=1+1' (так мы узнаем только в именах ли все дело или в формулах вообще)
- воспользоваться свойством FormulaLocal вместо Formula
- воспользоваться свойством Value (через Value тоже прекрасно вводятся формулы)

Какой версии у Вас Office?
Попробуйте также перед присвоеним формулы приводить получившуюся строку с формулой к WideString.
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

А еще убедитесь, что у ячеек, кудапишутся формулы NumberFormat = 'General', ну или по крайней мере не текстовый.
Gray[cLmT]
Сообщения: 8
Зарегистрирован: 18 мар 2009, 07:06

Со свойством Value также не работат, а вот со FormulaLocal всё замечательно проходит! БОльшое Вам спасибо Naeel! Очень помогли.
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

А теперь попробуйте что-нибудь типа:

Excel.WorkBooks[1].WorkSheets[1].Rows[4].FormulaR1C1Local:='=R[-1]С/R[-2]C'

и посмотрите что получилось. :)
Может Вам стоит все переделать вообще ;)
Аватара пользователя
Игорь Акопян
Сообщения: 1440
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

Gray[cLmT писал(а):При выполнении: Excel.WorkBooks[1].WorkSheets[1].Rows[4].FormulaR1C1Local:='=R[-1]С/R[-2]C'
выскакивает ошибка: "OLE error 800A03EC".
пусть пока остаётся как есть, времени пока не хватает.
пост пополам разделить не вышло :(
Изображение
Ответить