Z-7000 0 / 0 / 0 Регистрация: 07.02.2012 Сообщений: 40 |
||||||||||||
1 |
||||||||||||
03.07.2014, 08:20. Показов 8786. Ответов 6 Метки нет (Все метки)
Добрый день!
…
грязно ругается!!!
не ругается. Но в ячейке стоит #ИМЯ?, нужно зайти в ячейку и нажать Enter что отработала формула.
0 |
Mawrat 13094 / 5875 / 1706 Регистрация: 19.09.2009 Сообщений: 8,808 |
||||||||||||||||
03.07.2014, 09:37 |
2 |
|||||||||||||||
Сообщение было отмечено Z-7000 как решение Решение
Для этого использовал формулы типа: Достаточно формулы №1.
Когда копирую из шаблона листы Выполнение первой строки не приводит к потере формул. Значит, где-то дальше в коде формулы затираются.
Если пытаюсь cоpдать формулу из Delphi в Excel, используя первую формулу: Если формула устанавливается программно, то она должна быть записана в варианте для английского языка: Код =IF(B!AD9<>"";B!AD9;"")
WorkSheet2.WorkSheets[2].Cells[13,10].Formula:= ‘=СЦЕПИТЬ(Z!AD9)’; Как выше уже упоминалось — в случае программной записи формулы надо задавать в варианте для английского языка. После записи формул надо или выполнить перерасчёт отдельного листа:
или перерасчёт всех открытых рабочих книг — на случай, если на других листах есть формулы, связанные текущим листом:
—
Потому, что выполнение самой этой строки не приводит к потере формул. Добавлено через 19 минут
После записи формул надо или выполнить перерасчёт отдельного листа: Вернее, лучше так — если формул много, то перед их записью надо отключить режим автоматического пересчёта. А после записи всех формул, вновь включить автоматический пересчёт:
2 |
Z-7000 0 / 0 / 0 Регистрация: 07.02.2012 Сообщений: 40 |
||||||||||||
04.07.2014, 03:41 [ТС] |
3 |
|||||||||||
Большое спасибо за такой прекрасный ответ.
Excel использует в формуле «;» — точку с запятой, но для Delphi это ошибка, нужна просто запятая:
В Excel уже будет все как нужно!
это диапазон строк в котором происходит перерасчет?
0 |
Mawrat 13094 / 5875 / 1706 Регистрация: 19.09.2009 Сообщений: 8,808 |
||||||||||||
04.07.2014, 08:45 |
4 |
|||||||||||
Excel использует в формуле «;» — точку с запятой, но для Delphi это ошибка, нужна просто запятая: Правильно. Только это не в Delphi дело. Это в Excel такая особенность записи формул через программу — что аргументы надо разделять запятой, а не точкой с запятой.
И получается что цифры:
это диапазон строк в котором происходит перерасчет? Это константы, с помощью которых задаётся режим перерасчёта формул. Если мы пишем так:
то включается автоматический режим перерасчёта. В этом случае каждый раз, когда мы записываем формулу в ячейку, Excel выполняет перерасчёт. Этот режим чаще всего задействован по начальным установкам.
то Excel не будет автоматически выполнять расчёты по формулам. Расчёт будет выполнен, только, если вызвать метод exApp.Calculate (если exWorkSheet.Calculate для пересчёта отдельного листа). Это бывает полезно, когда на листы надо записать большое количество формул — чтобы Excel во время этого процесса не выполнял перерасчёты.
0 |
0 / 0 / 0 Регистрация: 07.02.2012 Сообщений: 40 |
|
04.07.2014, 09:38 [ТС] |
5 |
Все предельно ясно ) Код =IF(лист!N83Font.Underline=true,лист!N83,"") а найти пример не могу (
0 |
13094 / 5875 / 1706 Регистрация: 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. Как заставить его открываться поверх, всех окон и в развернутом виде, а не маленьким прямоугольником, что тоже бывает.!.?
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
04.07.2014, 11:04 |
7 |
Содержание
- Excel delphi формула если
- Excel delphi формула если
- Excel delphi формула если
Excel delphi формула если
формула в ячейку Excel помещается так:
вопрос в том, как заставить Excel ее вычислить, потому как вместо результата в ячейке светится #ИМЯ? и подсказка «формула содержит нераспознанный текст» и если после этого установить курсор на строку с форулой и просто нажать Enter то формула прекрасно вычисляется. Как сделать то же самое программным методом?
причем строка «=(2+2)» вычисляется нормально.
насколько я понял распознать оно не может слово «СУММ».
также пытался делать нечто вроде
но это ничего не меняет.
От: | Horror_Infinity | |
Дата: | 18.10.05 12:07 | |
Оценка: |
Здравствуйте, A7exander, Вы писали:
A>формула в ячейку Excel помещается так:
A>
A> вопрос в том, как заставить Excel ее вычислить, потому как вместо результата в ячейке светится #ИМЯ? и подсказка «формула содержит нераспознанный текст» и если после этого установить курсор на строку с форулой и просто нажать Enter то формула прекрасно вычисляется. Как сделать то же самое программным методом?
A> причем строка «=(2+2)» вычисляется нормально.
A> насколько я понял распознать оно не может слово «СУММ».
A> также пытался делать нечто вроде
A>
A>но это ничего не меняет.
Правильно будет написать вот так:
Имена формул надо писать по-английски. И будет тебе счастье. Причем, неважно — русский или аглицкий ексель у тебя стоит.
От: | Danchik | |
Дата: | 18.10.05 12:13 | |
Оценка: |
Здравствуйте, A7exander, Вы писали:
Попробуй написать так:
От: | A7exander | |
Дата: | 18.10.05 12:34 | |
Оценка: |
Здравствуйте, Horror_Infinity, Вы писали:
H_I>Правильно будет написать вот так:
H_I>
H_I>Имена формул надо писать по-английски. И будет тебе счастье. Причем, неважно — русский или аглицкий ексель у тебя стоит.
Спасибо за отклик, попробовал, но в результате тот же «#ИМЯ?» вместо результата, та же подсказка, но вдобавок теперь если установить курсор на строку с формулой в ячейке и нажать Enter то ничего не меняется, тоесть похоже «SUMM» эксель не понимает впринципе. Может где то переключить что нибудь нужно, чтоб англоязычные функции понимал? Эксель из пакета «OFFICE 2003»
От: | A7exander | |
Дата: | 18.10.05 12:41 | |
Оценка: |
Здравствуйте, Danchik, Вы писали:
D>Попробуй написать так:
D>
Как я уже отвечал Horror_Infinity, применение «SUMM» ничего не дает, и Excel понимает только «СУММА». Применение «.Formula» к сожалению таже ничего не меняет.
От: | Horror_Infinity | |
Дата: | 18.10.05 12:51 | |
Оценка: |
Здравствуйте, A7exander, Вы писали:
H_I>>
A>Спасибо за отклик, попробовал, но в результате тот же «#ИМЯ?» вместо результата, та же подсказка, но вдобавок теперь если установить курсор на строку с формулой в ячейке и нажать Enter то ничего не меняется, тоесть похоже «SUMM» эксель не понимает впринципе. Может где то переключить что нибудь нужно, чтоб англоязычные функции понимал? Эксель из пакета «OFFICE 2003»
Сорри за опечатку!
Конечно же, надо написать вот так:
З.Ы. На будущее. Очень легко подсмотреть, как правильно писать формулы: Включаешь запись макроса в Екселе, пишешь нужную тебе формулу, останавливаешь запись, идешь в редактор макросов и смотришь, как надо тебе в дельфе написать, чтоб все работало.
От: | Dimonka | |
Дата: | 18.10.05 12:59 | |
Оценка: |
От: | A7exander | |
Дата: | 18.10.05 13:17 | |
Оценка: |
Здравствуйте, Horror_Infinity, Вы писали:
H_I>Сорри за опечатку!
H_I>Конечно же, надо написать вот так:
H_I>
H_I>З.Ы. На будущее. Очень легко подсмотреть, как правильно писать формулы: Включаешь запись макроса в Екселе, пишешь нужную тебе формулу, останавливаешь запись, идешь в редактор макросов и смотришь, как надо тебе в дельфе написать, чтоб все работало.
Спасибо, SUM сработало, причем если SUM набирать в формуле вручную то Excel ее не понимает, что меня и сбило с толку, однако при программном занесении в ячейку конвертирует в «СУММ» и нормально вычисляет.
От: | A7exander | |
Дата: | 18.10.05 13:17 | |
Оценка: |
Спасибо, применение «SUM» помогло
От: | NRiS | |
Дата: | 18.10.05 17:14 | |
Оценка: |
что бы эксель понимал формулы с кирилическими символами вроде СУММ нодо писать так
От: | Horror_Infinity | |
Дата: | 19.10.05 04:40 | |
Оценка: |
Здравствуйте, NRiS, Вы писали:
NRS>что бы эксель понимал формулы с кирилическими символами вроде СУММ нодо писать так
Тогда английский ексель перестает понимать такие формулы. Как быть? У меня (да и не только у меня) стоит именно оригинальная английская версия.
Источник
Excel delphi формула если
Добрцый день! Есть такая проблема: хочется из Delphi 5 записывать в MS Excel всякие разные формулы, отличные от SUM. Помогите кто знает как это делать!
← →
Романов Р.В. ( 2004-01-08 12:25 ) [1]
← →
REP ( 2004-01-08 12:31 ) [2]
cells.Formula := «=MIN(A1:A10)»; Вроде как русские формулы он не понимает. Хотя может и от версии зависит.
← →
EgorT ( 2004-01-08 12:34 ) [3]
Не помогает пишет «#ИМЯ?» в той ячейке, то есть результат считать не могу, или если записть формулу «=ЕСЛИ(A1=10;A2+A3;0)» тоже ничего хорошего не получилось
← →
EgorT ( 2004-01-08 12:35 ) [4]
например Сумм понимает замечательно а все остальное нет
A1 пиши на английской раскладке
← →
REP ( 2004-01-08 13:06 ) [6]
Вместо точки с запятой используй ЗАПЯТУЮ
А в сумм ты не используешь точку с запятой
Типа:
«=ЕСЛИ(A1=10 , A2+A3,0)»
← →
EgorT ( 2004-01-08 13:10 ) [7]
А1 пишу по английски, а на счет запятой попробую
← →
Карелин Артем ( 2004-01-08 13:26 ) [8]
Делай макрос и формулу бери из макроса. К примеру =ЕСЛИ(H8=12;G3;12) на самом деле будет «=IF(R[7]C[7]=12,R[2]C[6],12)»
← →
EgorT ( 2004-01-08 13:39 ) [9]
А если данный файлик каждый раз новый будет макрос к чему прицеплять, и все формулы туда записывать, или я чего то не понял
Карелин Артем © (08.01.04 13:26) [8]
Ну не обязательно уж прямо R[7]C[7] Можно и обычно использовать H8, однако с синтаксисом нужно быть поосторожнее. Можно в Екселе находить нужную формулу по русски, а затем в «смотри также»(See also) находить ее англоязычный синтаксис
← →
Карелин Артем ( 2004-01-08 13:52 ) [11]
REP © (08.01.04 13:45) [10]
Не обязательно. Это я через запись макроса получил.
EgorT (08.01.04 13:39) [9]
Именно не понял идею. Через макрос Названия формул надо получать. Хранить из не надо.
← →
REP ( 2004-01-08 14:03 ) [12]
Карелин Артем © (08.01.04 13:52) [11]
Сидим и говорим друг другу «не обязательно, не обязательно»
Все таки нагляднее H8 (роднее для тех кто ексель знает немного)
А так пиши как угодно, не спорю.
:))
EgorT (08.01.04 13:39) [9]
А идея рассмотрена в соседней ветке:
http://delphimaster.net/view/1-1073549258/
По сути однотипные вопросы-то. И решение проблемы одно.
Источник
Excel delphi формула если
В этой статье я познакомлю вас как работать с MS Excel из Delphi. Данная статья может быть полезна людям, которые хотят научиться создавать различные отчеты в Excel из программ написанных на Delphi. Статья содержит справочные данные необходимые для работы с MS Excel. Здесь вы найдете информацию о том как:
— Подключить и правильно отключить интерфейс Excel;
— Как изменить размер, цвет и тип шрифта;
— Как выделить, объединить, заполнить и размножить диапазон ячеек;
— Как повернуть и отцентрировать текст;
— Как нарисовать границы ячеек;
— Как ввести формулу в ячейку и многое другое.
Работать будем через модуль ComObj, для этого в uses необходимо добавить модуль ComObj и модуль Excel_TLB (для MS Excel 2007).
Uses ……, ComObj, Excel_TLB;
Модуль Excel_TLB содержит необходимые константы для работы с Excel, его можно не подключать, но тогда придется в ручную прописывать значения всех используемых констант из этого модуля. Значения констант можно найти внутри модуля или в интернете, но для разных версий MS Excel они разные.
Внимание. Модуль Excel_TLB в других версиях MS Excel может называться по другому. Перед подключением модуля Excel_TLB, необходимо импортировать библиотеку Excel. Для этого выберите Component->Import Component->Import a Type Library-> находим MS Excel и следуем инструкциям.
В разделе описания переменных мы должны описать переменную типа Variant или OleVariant для подключения интерфейса Excel. Я описал переменную excel.
Form1: TForm1;
excel : variant; // Переменная в которой создаётся объект EXCEL
Внимание. Всегда когда создаете объект интерфейса, заключайте процедуру создания в модуль обработки ошибок:
try
создаем интерфейс;
формируем отчет;
освобождаем интерфейс;
Except
обрабатываем ошибки;
освобождаем интерфейс;
end;
Далее идет краткий справочник по основным функциям работы с EXCEL
try
// создаем обьект EXCEL
excel := CreateOleObject(‘Excel.Application’);
// Чтоб не задавал вопрос о сохранении документа
excel.DisplayAlerts := false;
// создаем новый документ рабочую книгу
excel.WorkBooks.Add;
// или загружаем его из директории с программой
excel.WorkBooks.Open(GetCurrentDir() + ‘отчет.xls’);
// Делаем его видимым данную функцию после отладки и тестирования лучше использовать в конце, после сформирования отчета (это ускоряет процесс вывода данных в отчет)
excel.Visible := true;
//задаем тип формул в формате R1C1
excel.Application.ReferenceStyle := xlR1C1;
// задаем тип формул в формате A1
excel.Application.ReferenceStyle := xlA1;
// Задаем название первому и второму листу
excel.WorkBooks[1].WorkSheets[1].Name := ‘Отчет1’;
excel.WorkBooks[1].WorkSheets[2].Name := ‘Отчет2’;
//задаем формат числа для первой и четвертой колонки формат числа
excel.WorkBooks[1].WorkSheets[1].Columns[1].NumberFormat := ‘0,00’;
excel.WorkBooks[1].WorkSheets[1].Columns[4].NumberFormat := ‘0,0’;
// задаем ширину первой и второй колонки
excel.WorkBooks[1].WorkSheets[1].Columns[1].ColumnWidth := 10;
excel.WorkBooks[1].WorkSheets[1].Columns[2].ColumnWidth := 20;
// задаем начертание, цвет, размер и тип шрифта для первого ряда
excel.WorkBooks[1].WorkSheets[1].Rows[1].Font.Bold := True; //жирный
excel.WorkBooks[1].WorkSheets[1].Rows[1].Font.Color := clRed; // цвет красный
excel.WorkBooks[1].WorkSheets[1].Rows[1].Font.Size := 12; //размер 12
excel.WorkBooks[1].WorkSheets[1].Rows[1].Font.Name := ‘Times New Roman’; //шрифт
//присваиваем ячейке 1,4 и 2,4 значения (1 — ряд, 4 — колонка)
excel.WorkBooks[1].WorkSheets[1].Cells[1, 4] := ‘А так можно внести значение в ячейку’;
excel.WorkBooks[1].WorkSheets[1].Cells[2, 4] := ‘А так можно внести значение в ячейку’;
//ввод в ячейку ‘A12’ формулы ‘=b5+c4’
excel.WorkBooks[1].WorkSheets[1].Range[‘A12′].Formula:=’=b5+c4’;
// Выравнивам первый ряд по центру по вертикали
excel.WorkBooks[1].WorkSheets[1].Rows[1].VerticalAlignment := xlCenter;
// Выравнивам первый ряд по центру по горизонтали
excel.WorkBooks[1].WorkSheets[1].Rows[1].HorizontalAlignment := xlCenter;
// Выравнивам в ячейке по левому краю
excel.WorkBooks[1].WorkSheets[1].Cells[3, 2].HorizontalAlignment := xlLeft;
// Выравнивам в ячейке по правому краю
excel.WorkBooks[1].WorkSheets[1].Cells[3, 4].HorizontalAlignment := xlRight;
// Обьединяем ячейки ‘A1:A8’
excel.WorkBooks[1].WorkSheets[1].Range[‘A1:A8’].Merge;
// Поворачиваем слова под углом 90 градусов для второго ряда
excel.WorkBooks[1].WorkSheets[1].Rows[2].Orientation := 90;
// Поворачиваем слова под углом 45 градусов для диапазона ячеек ‘B3:D3’
excel.WorkBooks[1].WorkSheets[1].Range[‘B3:D3’].Orientation := 45;
//рисуем границы выделенного диапазона левая
excel.Selection.Borders[xlEdgeLeft].LineStyle := xlContinuous; // стиль линии сплошная
excel.Selection.Borders[xlEdgeLeft].Weight := xlMedium;// толщина линии
//рисуем границы выделенного диапазона верхняя
excel.Selection.Borders[xlEdgeTop].LineStyle := xlContinuous;
excel.Selection.Borders[xlEdgeTop].Weight := xlMedium;
//рисуем границы выделенного диапазона нижняя
excel.Selection.Borders[xlEdgeBottom].LineStyle := xlContinuous;
excel.Selection.Borders[xlEdgeBottom].Weight := xlMedium;
//рисуем границы выделенного диапазона правая
excel.Selection.Borders[xlEdgeRight].LineStyle := xlContinuous;
excel.Selection.Borders[xlEdgeRight].Weight := xlMedium;
//рисуем границы выделенного диапазона вертикальные внутрениие
excel.Selection.Borders[xlInsideVertical].LineStyle := xlContinuous;
excel.Selection.Borders[xlInsideVertical].Weight := xlMedium;
//рисуем границы выделенного диапазона горизонтальные внутрениие
excel.Selection.Borders[xlInsideHorizontal].LineStyle := xlContinuous;
excel.Selection.Borders[xlInsideHorizontal].Weight := xlMedium;
//автозаполнение выделенного диапазона
//для примера заполним область ячеек ‘A10:C10’ словом ‘привет’
//и размножим его вниз еще на пять ячеек ‘A10:C15’
excel.WorkBooks[1].WorkSheets[1].Range[‘A10:C10′].Value:=’привет’;
//выделяем диапазон ячеек ‘A10:C10’
excel.WorkBooks[1].WorkSheets[1].Range[‘A10:C10’].Select;
//автозаполняем (копируем) выделенным диапазоном область ячеек ‘A10:C15’
excel.selection.autofill(excel.WorkBooks[1].WorkSheets[1].Range[‘A10:C15’],xlFillDefault);
//отключаем предупреждения, чтобы не задавал вопросов о сохранении и других
excel.DisplayAlerts := False;
//сохраняем документ в формате Excel 97-2003
excel.ActiveWorkBook.Saveas(GetCurrentDir() + ‘отчет.xls’,xlExcel8);
//сохраняем документ в текущем формате Excel 2007
excel.ActiveWorkBook.Saveas(GetCurrentDir() + ‘отчет.xlsx’);
//закроем все книги
excel.Workbooks.Close;
//закрываем Excel
excel.Application.quit;
//освобождаем интерфейсы
excel := Unassigned;
//обрабатываем ошибки
showmessage(‘Внимание! Произошла ошибка при создании MS Excel приложения’);
//закроем все книги
excel.Workbooks.Close;
//закрываем Excel
excel.Application.quit;
//освобождаем интерфейсы
excel := Unassigned;
end;
end;
При работе с листом Excel мы можем использовать следующие варианты:
— работать с областью Range[‘B3:D3’];
— работать с ячейкой Cells[2, 4] где 2 — ряд, 4 — колонка;
— работать с рядами Rows[1] или с диапазоном рядов Rows[‘1:5’];
— работать с колонками Columns[1] или диапазоном колонок Columns[‘A:I’];
Range[‘A1’] и Cells[1, 1] обозначают одно и тоже.
После сформирования документа или возникновении ошибки вы должны правильно освободить интерфейсы.
Иначе при закрытии Excel он скрывается с экрана, но если открыть диспетчер задач он продолжает там висеть и если данный процесс не завершить , то при каждом новом запуске их будет накапливаться больше и больше, пока компьютер не начнет виснуть. Поэтому обязательно необходимо освобождать все интерфейсы с вязанные с Excel с его книгами и листами.
Например так:
//закроем все книги
excel.Workbooks.Close;
//закрываем Excel
excel.Application.quit;
//освобождаем интерфейсы
sheet:=Unassigned; //интерфейс листа если он был создан
WorkBook := Unassigned;//интерфейс рабочей книги если он был создан
excel := Unassigned;//интерфейс самого предложения если он был создан
Ниже привожу пример вывода в Excel из Delphi таблицы умножения с подробными комментариями.
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, comobj, StdCtrls, Excel_TLB;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
< Private declarations >
public
< Public declarations >
end;
var
Form1: TForm1;
excel: variant; // Переменная в которой создаётся объект EXCEL
MyData: variant; // Переменная в которой формируется таблица умножения
i,j:integer;
implementation
procedure TForm1.Button1Click(Sender: TObject);
begin
try
// Обьект EXCEL
excel := CreateOleObject(‘Excel.Application’);
// Чтоб не задавал вопрос о сохранении документа
excel.DisplayAlerts := false;
// новый документ
excel.WorkBooks.Add;
//объявляем вариантный массив
MyData := VarArrayCreate([1,9,1,9],varVariant);
for I := 1 to 9 do
for J := 1 to 9 do
MyData[i,j]:=i*j;
// Обьединяем ячейки ‘A1:I1’
excel.WorkBooks[1].WorkSheets[1].Range[‘A1:I1’].Merge;
//Пишем заголовок
excel.WorkBooks[1].WorkSheets[1].Range[‘A1′].Value:=’Таблица умножения’;
// Выравнивам заголовок по центру
excel.WorkBooks[1].WorkSheets[1].Range[‘A1’].HorizontalAlignment := xlCenter;
// задаем ширину колонок с A по I
excel.WorkBooks[1].WorkSheets[1].Columns[‘A:I’].ColumnWidth := 3;
//выделяем область таблицы умножения [‘A2:I10’] и рисуем границы
excel.WorkBooks[1].WorkSheets[1].Range[‘A2:I10’].select;
//рисуем границы выделенного диапазона левая
excel.Selection.Borders[xlEdgeLeft].LineStyle := xlContinuous; // стиль линии сплошная
excel.Selection.Borders[xlEdgeLeft].Weight := xlThin;// толщина линии
//рисуем границы выделенного диапазона верхняя
excel.Selection.Borders[xlEdgeTop].LineStyle := xlContinuous;
excel.Selection.Borders[xlEdgeTop].Weight := xlThin;
//рисуем границы выделенного диапазона нижняя
excel.Selection.Borders[xlEdgeBottom].LineStyle := xlContinuous;
excel.Selection.Borders[xlEdgeBottom].Weight := xlThin;
//рисуем границы выделенного диапазона правая
excel.Selection.Borders[xlEdgeRight].LineStyle := xlContinuous;
excel.Selection.Borders[xlEdgeRight].Weight := xlThin;
//рисуем границы выделенного диапазона вертикальные внутрениие
excel.Selection.Borders[xlInsideVertical].LineStyle := xlContinuous;
excel.Selection.Borders[xlInsideVertical].Weight := xlThin;
//рисуем границы выделенного диапазона горизонтальные внутрениие
excel.Selection.Borders[xlInsideHorizontal].LineStyle := xlContinuous;
excel.Selection.Borders[xlInsideHorizontal].Weight := xlThin;
//присваиваем диапазону [‘A2:I10’] значения вариантного массива MyData это значительно ускоряет работу, нежели вывод по //ячеечно
Источник
← →
EgorT
(2004-01-08 12:24)
[0]
Добрцый день! Есть такая проблема: хочется из Delphi 5 записывать в MS Excel всякие разные формулы, отличные от SUM. Помогите кто знает как это делать!
← →
Романов Р.В.
(2004-01-08 12:25)
[1]
cells.Formula := «=МИН(A1:A10)»;
← →
REP
(2004-01-08 12:31)
[2]
cells.Formula := «=MIN(A1:A10)»; Вроде как русские формулы он не понимает. Хотя может и от версии зависит.
← →
EgorT
(2004-01-08 12:34)
[3]
Не помогает пишет «#ИМЯ?» в той ячейке, то есть результат считать не могу, или если записть формулу «=ЕСЛИ(A1=10;A2+A3;0)» тоже ничего хорошего не получилось
← →
EgorT
(2004-01-08 12:35)
[4]
например Сумм понимает замечательно а все остальное нет
← →
Романов Р.В.
(2004-01-08 13:00)
[5]
A1 пиши на английской раскладке
← →
REP
(2004-01-08 13:06)
[6]
Вместо точки с запятой используй ЗАПЯТУЮ
А в сумм ты не используешь точку с запятой
Типа:
«=ЕСЛИ(A1=10
, A2+A3,0)»
← →
EgorT
(2004-01-08 13:10)
[7]
А1 пишу по английски, а на счет запятой попробую
← →
Карелин Артем
(2004-01-08 13:26)
[8]
Делай макрос и формулу бери из макроса. К примеру
=ЕСЛИ(H8=12;G3;12)
на самом деле будет
"=IF(R[7]C[7]=12,R[2]C[6],12)"
← →
EgorT
(2004-01-08 13:39)
[9]
А если данный файлик каждый раз новый будет макрос к чему прицеплять, и все формулы туда записывать, или я чего то не понял
← →
REP
(2004-01-08 13:45)
[10]
Карелин Артем © (08.01.04 13:26) [8]
Ну не обязательно уж прямо R[7]C[7] Можно и обычно использовать H8, однако с синтаксисом нужно быть поосторожнее. Можно в Екселе находить нужную формулу по русски, а затем в «смотри также»(See also) находить ее англоязычный синтаксис
← →
Карелин Артем
(2004-01-08 13:52)
[11]
REP © (08.01.04 13:45) [10]
Не обязательно. Это я через запись макроса получил.
EgorT (08.01.04 13:39) [9]
Именно не понял идею. Через макрос Названия формул надо получать. Хранить из не надо.
← →
REP
(2004-01-08 14:03)
[12]
Карелин Артем © (08.01.04 13:52) [11]
Сидим и говорим друг другу «не обязательно, не обязательно»
Все таки нагляднее H8 (роднее для тех кто ексель знает немного)
А так пиши как угодно, не спорю.
:))
EgorT (08.01.04 13:39) [9]
А идея рассмотрена в соседней ветке:
http://delphimaster.net/view/1-1073549258/
По сути однотипные вопросы-то. И решение проблемы одно…
Вставка формулы в Excel
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
|
|
Full Member Рейтинг (т): 10 |
Подскажите как вставить формулу в ячейку Excel.
ASheetRef.Range[‘C19:C19′]:=’=СУММ(C6;C11;C14:C18)’; и вот так:
ASheetRef.Range[‘C19:C19′].Formula:=’=СУММ(C6;C11;C14:C18)’; И еще по всякому. Искал в интернете — ничего толкового не могу найти. Вылетает ошибка. И еще. Я в цикле (вернее в двух) перебираю ячейки и обрисовываю граници:
for i:=1 to PeriodCount + 2 do begin for j:=1 to INIT_ROW_COUNT do begin ASheetRef.Cells[j,i].Borders[EDGE_TOP].LineStyle:=LINE_STYLE; ASheetRef.Cells[j,i].Borders[EDGE_TOP].Weight:=LINE_WIDTH; ASheetRef.Cells[j,i].Borders[EDGE_LEFT].LineStyle:=LINE_STYLE; ASheetRef.Cells[j,i].Borders[EDGE_LEFT].Weight:=LINE_WIDTH; ASheetRef.Cells[j,i].Borders[EDGE_BOTTOM].LineStyle:=LINE_STYLE; ASheetRef.Cells[j,i].Borders[EDGE_BOTTOM].Weight:=LINE_WIDTH; ASheetRef.Cells[j,i].Borders[EDGE_RIGHT].LineStyle:=LINE_STYLE; ASheetRef.Cells[j,i].Borders[EDGE_RIGHT].Weight:=LINE_WIDTH; end; end; но все это происходит так меееееедленно. Нет ли способа ускорить процес? |
anika |
|
Newbie Рейтинг (т): 0 |
По поводу второго могу порекомендовать убрать обновление экрана перед выполнением кода (_WordDoc как TWordDocument):
_WordDoc.Application.ScreenUpdating:=false; а самом конце обратно соответственно в true Добавлено 25.09.04, 23:07
Sheet.Cells.Item[i,j].Value:=’=SUM(C6;C11;C14:C18)’ |
Jureth |
|
Цитата rapido @ 26.09.04, 00:40 И еще. Я в цикле (вернее в двух) перебираю ячейки и обрисовываю граници:
for i:=1 to PeriodCount + 2 do begin for j:=1 to INIT_ROW_COUNT do begin ASheetRef.Cells[j,i].Borders[EDGE_TOP].LineStyle:=LINE_STYLE; ASheetRef.Cells[j,i].Borders[EDGE_TOP].Weight:=LINE_WIDTH; ASheetRef.Cells[j,i].Borders[EDGE_LEFT].LineStyle:=LINE_STYLE; ASheetRef.Cells[j,i].Borders[EDGE_LEFT].Weight:=LINE_WIDTH; ASheetRef.Cells[j,i].Borders[EDGE_BOTTOM].LineStyle:=LINE_STYLE; ASheetRef.Cells[j,i].Borders[EDGE_BOTTOM].Weight:=LINE_WIDTH; ASheetRef.Cells[j,i].Borders[EDGE_RIGHT].LineStyle:=LINE_STYLE; ASheetRef.Cells[j,i].Borders[EDGE_RIGHT].Weight:=LINE_WIDTH; end; end;
У тебя приличную часть времени занимает доступ к ячейке таблицы, если запомнить этот адрес в переменной, то будет немного быстрее:
var a : OleVariant;//или какой он там? .. for i:=1 to PeriodCount + 2 do begin for j:=1 to INIT_ROW_COUNT do begin a := ASheetRef.Cells[j,i]; a.Borders[EDGE_TOP].LineStyle:=LINE_STYLE; a.Borders[EDGE_TOP].Weight:=LINE_WIDTH; a.Borders[EDGE_LEFT].LineStyle:=LINE_STYLE; a.Borders[EDGE_LEFT].Weight:=LINE_WIDTH; a.Borders[EDGE_BOTTOM].LineStyle:=LINE_STYLE; a.Borders[EDGE_BOTTOM].Weight:=LINE_WIDTH; a.Borders[EDGE_RIGHT].LineStyle:=LINE_STYLE; a.Borders[EDGE_RIGHT].Weight:=LINE_WIDTH; end; end; Сообщение отредактировано: Jureth — 27.09.04, 04:31 |
Bas |
|
Замни на FormulaR1C1 как это делает сам Excel
ActiveCell.FormulaR1C1 = «=VALUE(RC[-4])» |
rapido |
|
Full Member Рейтинг (т): 10 |
Спасибо всем за ответы. Цитата anika, 26.09.04, 01:51 По поводу второго могу порекомендовать убрать обновление экрана перед выполнением кода (_WordDoc как TWordDocument): _WordDoc.Application.ScreenUpdating:=false; а самом конце обратно соответственно в true Цитата Jureth, 27.09.04, 07:05 У тебя приличную часть времени занимает доступ к ячейке таблицы, если запомнить этот адрес в переменной, то будет немного быстрее: Пробовал. Выигрыш незначительный. С формулами все равно не получается.
ASheetRef.Cells[19,3]:=’=SUM(C6;C11;C14:C18)’; ASheetRef.Range[‘C19:C19′].Formula:=’СУММ(C6;C11;C14:C18)’; ASheetRef.Range[‘C19’, ‘C20′].Formula :=’=SUM(C6;C11;C14:C18)’; ASheetRef.Cells.Item[19,3].Value:=’=SUM(C6;C11;C14:C18)’; ASheetRef.Cells[19, 3].Formula:=’=SUM(C6;C11;C14:C18)’; ASheetRef.Cells[19, 3].FormulaR1C1:=’=SUM(C6;C11;C14:C18)’; Может я чего-то недопонимаю? |
Jureth |
|
Цитата С формулами все равно не получается. Она скорее всего матюгается на ‘SUM’ — эту функцию она не понимает даже если её ввести руками (#ИМЯ?). Цитата Пробовал. Выигрыш незначительный. Тогда можно попробовать сначала сгенерировать строку из адресов ячеек для Range, а потом проставить Borders для полученного диапазона(алгоритм сейчас не дам — занят, но к вечеру или завтра — попробую). Если и это не поможет, то тогда смирись — Excel вообще штука не быстрая. |
Jureth |
|
Этот вариант у меня сработал:
aSheetRef.Cells[19,3].FormulaLocal:=’=СУММ(C6;C11;C14:C18)’; Процедуры, генерирующая строку:
//Вспомогательная — генерирует буквенное представление столбца по его номеру function GetCol(Col: integer): String; begin if Col<27 then Result := Chr(Col+64) else Result := Chr((Col div 26)+64)+ Chr((Col mod 26)+64) end; //Возвращает строку типа ‘A1’ для одной ячейки function CellsToRange(Row1, Col1: Integer): String; overload; var S : String; begin S := GetCol(Col1)+IntToStr(Row1); Result := S; end; //Возвращает строку типа ‘A1:C5’ для диапазона (Row1, Col1 — TopLeft угол, Row2, Col2 — RightBottom) function CellsToRange(Row1, Col1, Row2, Col2: Integer): String; overload; var S : String; begin S := GetCol(Col1)+IntToStr(Row1)+’:’+ GetCol(Col2)+ IntToStr(Row2); Result := S; end; юзается это примерно так:
Sheet.Range[CellsToRange(1,1,15,15)].Borders[11].Weight := 2; Sheet.Range[CellsToRange(1,1,15,15)].Borders[11].LineStyle := 4 Пока всё. |
rapido |
|
Full Member Рейтинг (т): 10 |
Ураааааа! Работает!
procedure DrawCellBorders(var ASheetRef: Variant); const EDGE_LEFT = 7; EDGE_TOP = 8; EDGE_BOTTOM = 9; EDGE_RIGHT = 10; INNER_VERTICAL = 11; INNER_HOR = 12; LINE_STYLE = 1; LINE_WIDTH = 2; begin ASheetRef.Range[CellsToRange(1,1,86,PeriodCount + 2)].Borders[INNER_VERTICAL].Weight:=LINE_WIDTH; ASheetRef.Range[CellsToRange(1,1,86,PeriodCount + 2)].Borders[INNER_VERTICAL].LineStyle:=LINE_STYLE; ASheetRef.Range[CellsToRange(1,1,86,PeriodCount + 2)].Borders[INNER_HOR].Weight:=LINE_WIDTH; ASheetRef.Range[CellsToRange(1,1,86,PeriodCount + 2)].Borders[INNER_HOR].LineStyle:=LINE_STYLE; ASheetRef.Range[CellsToRange(1,1,86,PeriodCount + 2)].Borders[EDGE_TOP].Weight:=LINE_WIDTH; ASheetRef.Range[CellsToRange(1,1,86,PeriodCount + 2)].Borders[EDGE_BOTTOM].LineStyle:=LINE_STYLE; ASheetRef.Range[CellsToRange(1,1,86,PeriodCount + 2)].Borders[EDGE_LEFT].Weight:=LINE_WIDTH; ASheetRef.Range[CellsToRange(1,1,86,PeriodCount + 2)].Borders[EDGE_RIGHT].LineStyle:=LINE_STYLE; end;//DrawCellBorders Прорисовывает почти мгновенно. Спасибо Jureth. Формула тоже вставляется. Только есть небольшая проблема. |
Jureth |
|
Попробуй Sheet.Calculate (или Range.Calculate) — он должен форсировать пересчет данных, но я не проверял. |
rapido |
|
Full Member Рейтинг (т): 10 |
Цитата Jureth, 29.09.04, 05:09 Попробуй Sheet.Calculate (или Range.Calculate) — он должен форсировать пересчет данных, но я не проверял. Работает. И еще два вопроса.
ASheetRef.Range[‘A1:A86′].NumberFormat:=’# ###0.0’; 2. И как присвоить имя книге:
ExcelApp:=CreateOleObject(‘Excel.Application’); ExcelApp.Visible:=true; WBRef:=ExcelApp.Workbooks.Add; WBRef.Name:=’Some name’; Вылетает ошибка и в первом и во втором случае. Искал в инете — ничего толкового не могу найти. У меня нету этой чертовой справки ВБ. |
Jureth |
|
1. Не знаю — не делал. Цитата У меня нету этой чертовой справки ВБ Переустановил бы Офис — ради разработки приложения можно и попотеть немного. |
rapido |
|
Full Member Рейтинг (т): 10 |
Понял. Еще раз спасибо. |
Miscђka |
|
Цитата Jureth, 4.10.04, 08:46 Переустановил бы Офис — ради разработки приложения можно и попотеть немного. офис можно и доустановить, не удаляя его полностью |
rapido |
|
Full Member Рейтинг (т): 10 |
Вот так работает:
ASheetRef.Range[CellsToRange(5,3,45,PeriodCount + 2)].NumberFormat:=’# ###,0;(# ###,0);0,0′; ASheetRef.Range[CellsToRange(50,3,86,PeriodCount + 2)].NumberFormat:=’# ###,0;(# ###,0);0,0′; |
0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
0 пользователей:
- Предыдущая тема
- Delphi: Общие вопросы
- Следующая тема
[ Script execution time: 0,0597 ] [ 16 queries used ] [ Generated: 13.04.23, 23:39 GMT ]
От: |
A7exander |
||
Дата: | 18.10.05 11:33 | ||
Оценка: |
формула в ячейку Excel помещается так:
var
Range, Sheet, Excel, v: Variant;
begin
Excel := CreateOleObject('Excel.Application');
Sheet := Excel.Workbooks[1].Sheets[1];
Sheet.Cells[i, j] := '=(2+2)'; // занесение формулы
Sheet.Cells[i, j] := '=СУММ(A1:A8)'; // занесение формулы
Excel.Visible := true;
end;
вопрос в том, как заставить Excel ее вычислить, потому как вместо результата в ячейке светится #ИМЯ? и подсказка «формула содержит нераспознанный текст» и если после этого установить курсор на строку с форулой и просто нажать Enter то формула прекрасно вычисляется… Как сделать то же самое программным методом?
причем строка «=(2+2)» вычисляется нормально.
насколько я понял распознать оно не может слово «СУММ».
также пытался делать нечто вроде
Sheet.Cells[y, i].Calculate;
но это ничего не меняет…
… << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: передать формулу в Excel
От: |
Horror_Infinity
|
||
Дата: | 18.10.05 12:07 | ||
Оценка: |
Здравствуйте, A7exander, Вы писали:
A>формула в ячейку Excel помещается так:
A>
A>var
A> Range, Sheet, Excel, v: Variant;
A>begin
A> Excel := CreateOleObject('Excel.Application');
A> Sheet := Excel.Workbooks[1].Sheets[1];
A> Sheet.Cells[i, j] := '=(2+2)'; // занесение формулы
A> Sheet.Cells[i, j] := '=СУММ(A1:A8)'; // занесение формулы
A> Excel.Visible := true;
A>end;
A>
A> вопрос в том, как заставить Excel ее вычислить, потому как вместо результата в ячейке светится #ИМЯ? и подсказка «формула содержит нераспознанный текст» и если после этого установить курсор на строку с форулой и просто нажать Enter то формула прекрасно вычисляется… Как сделать то же самое программным методом?
A> причем строка «=(2+2)» вычисляется нормально.
A> насколько я понял распознать оно не может слово «СУММ».
A> также пытался делать нечто вроде
A>
A> Sheet.Cells[y, i].Calculate;
A>
A>но это ничего не меняет…
Правильно будет написать вот так:
Sheet.Cells[i, j] := '=SUMM(A1:A8)'; // занесение формулы
Имена формул надо писать по-английски. И будет тебе счастье. Причем, неважно — русский или аглицкий ексель у тебя стоит.
… << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: передать формулу в Excel
От: |
Danchik
|
||
Дата: | 18.10.05 12:13 | ||
Оценка: |
Здравствуйте, A7exander, Вы писали:
Попробуй написать так:
Sheet.Cells[i, j].Formula := '=SUMM(A1:A8)'; // занесение формулы
Re[2]: передать формулу в Excel
От: |
A7exander |
||
Дата: | 18.10.05 12:34 | ||
Оценка: |
Здравствуйте, Horror_Infinity, Вы писали:
H_I>Правильно будет написать вот так:
H_I>
H_I>Sheet.Cells[i, j] := '=SUMM(A1:A8)'; // занесение формулы
H_I>
H_I>Имена формул надо писать по-английски. И будет тебе счастье. Причем, неважно — русский или аглицкий ексель у тебя стоит.
Спасибо за отклик, попробовал, но в результате тот же «#ИМЯ?» вместо результата, та же подсказка, но вдобавок теперь если установить курсор на строку с формулой в ячейке и нажать Enter то ничего не меняется, тоесть похоже «SUMM» эксель не понимает впринципе… Может где то переключить что нибудь нужно, чтоб англоязычные функции понимал? Эксель из пакета «OFFICE 2003»
… << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: передать формулу в Excel
От: |
A7exander |
||
Дата: | 18.10.05 12:41 | ||
Оценка: |
Здравствуйте, Danchik, Вы писали:
D>Попробуй написать так:
D>
D>Sheet.Cells[i, j].Formula := '=SUMM(A1:A8)'; // занесение формулы
D>
Как я уже отвечал Horror_Infinity, применение «SUMM» ничего не дает, и Excel понимает только «СУММА»… Применение «.Formula» к сожалению таже ничего не меняет.
… << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: передать формулу в Excel
От: |
Horror_Infinity
|
||
Дата: | 18.10.05 12:51 | ||
Оценка: |
Здравствуйте, A7exander, Вы писали:
H_I>>
H_I>>Sheet.Cells[i, j] := '=SUMM(A1:A8)'; // занесение формулы
H_I>>
A>Спасибо за отклик, попробовал, но в результате тот же «#ИМЯ?» вместо результата, та же подсказка, но вдобавок теперь если установить курсор на строку с формулой в ячейке и нажать Enter то ничего не меняется, тоесть похоже «SUMM» эксель не понимает впринципе… Может где то переключить что нибудь нужно, чтоб англоязычные функции понимал? Эксель из пакета «OFFICE 2003»
Сорри за опечатку!
Конечно же, надо написать вот так:
Sheet.Cells[i, j] := '=SUM(A1:A8)'; // занесение формулы
З.Ы. На будущее. Очень легко подсмотреть, как правильно писать формулы: Включаешь запись макроса в Екселе, пишешь нужную тебе формулу, останавливаешь запись, идешь в редактор макросов и смотришь, как надо тебе в дельфе написать, чтоб все работало.
… << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: передать формулу в Excel
От: |
Dimonka
|
||
Дата: | 18.10.05 12:59 | ||
Оценка: |
Re[4]: передать формулу в Excel
От: |
A7exander |
||
Дата: | 18.10.05 13:17 | ||
Оценка: |
Здравствуйте, Horror_Infinity, Вы писали:
H_I>Сорри за опечатку!
H_I>Конечно же, надо написать вот так:
H_I>
H_I>Sheet.Cells[i, j] := '=SUM(A1:A8)'; // занесение формулы
H_I>
H_I>З.Ы. На будущее. Очень легко подсмотреть, как правильно писать формулы: Включаешь запись макроса в Екселе, пишешь нужную тебе формулу, останавливаешь запись, идешь в редактор макросов и смотришь, как надо тебе в дельфе написать, чтоб все работало.
Спасибо, SUM сработало, причем если SUM набирать в формуле вручную то Excel ее не понимает, что меня и сбило с толку, однако при программном занесении в ячейку конвертирует в «СУММ» и нормально вычисляет.
… << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: передать формулу в Excel
От: |
A7exander |
||
Дата: | 18.10.05 13:17 | ||
Оценка: |
Здравствуйте, Dimonka, Вы писали:
D>Тут отвечали на похожий вопрос:
D>http://rsdn.ru/Forum/?mid=1353352&flat=0
Автор: wildwind
Дата: 30.08.05
Спасибо, применение «SUM» помогло
… << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: передать формулу в Excel
От: |
NRiS
|
||
Дата: | 18.10.05 17:14 | ||
Оценка: |
что бы эксель понимал формулы с кирилическими символами вроде СУММ нодо писать так
Sheet.Cells[i, j].FormulaLocal := '=СУММ(A1:A8)'
ICQ 349086699
Re[4]: передать формулу в Excel
От: |
Horror_Infinity
|
||
Дата: | 19.10.05 04:40 | ||
Оценка: |
Здравствуйте, NRiS, Вы писали:
NRS>что бы эксель понимал формулы с кирилическими символами вроде СУММ нодо писать так
NRS>
NRS>Sheet.Cells[i, j].FormulaLocal := '=СУММ(A1:A8)'
NRS>
Тогда английский ексель перестает понимать такие формулы. Как быть? У меня (да и не только у меня) стоит именно оригинальная английская версия.
… << RSDN@Home 1.1.4 stable SR1 rev. 568>>
- Переместить
- Удалить
- Выделить ветку
Пока на собственное сообщение не было ответов, его можно удалить.