
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.62] |
![]() |
|
Сообщ.
#1
,
|
|
|
Подскажите как вставить формулу в ячейку 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; но все это происходит так меееееедленно. Нет ли способа ускорить процес? |
Сообщ.
#2
,
|
|
|
По поводу второго могу порекомендовать убрать обновление экрана перед выполнением кода (_WordDoc как TWordDocument):
![]() ![]() _WordDoc.Application.ScreenUpdating:=false; а самом конце обратно соответственно в true Добавлено а формулу я присваивала как: ![]() ![]() Sheet.Cells.Item[i,j].Value:='=SUM(C6;C11;C14:C18)' |
Сообщ.
#3
,
|
|
|
Цитата 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; |
![]() |
Сообщ.
#4
,
|
|
Замни на FormulaR1C1 как это делает сам Excel
![]() ![]() ActiveCell.FormulaR1C1 = "=VALUE(RC[-4])" |
Сообщ.
#5
,
|
|
|
Спасибо всем за ответы.
Цитата anika, 26.09.04, 01:51 По поводу второго могу порекомендовать убрать обновление экрана перед выполнением кода (_WordDoc как TWordDocument): _WordDoc.Application.ScreenUpdating:=false; а самом конце обратно соответственно в true Цитата Jureth, 27.09.04, 07:05 У тебя приличную часть времени занимает доступ к ячейке таблицы, если запомнить этот адрес в переменной, то будет немного быстрее: Пробовал. Выигрыш незначительный. С формулами все равно не получается. При всех вариантах вылетает: OLE error 800A03EC ![]() ![]() 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)'; Может я чего-то недопонимаю? |
Сообщ.
#6
,
|
|
|
Цитата Она скорее всего матюгается на 'SUM' - эту функцию она не понимает даже если её ввести руками (#ИМЯ?).С формулами все равно не получается. Цитата Тогда можно попробовать сначала сгенерировать строку из адресов ячеек для Range, а потом проставить Borders для полученного диапазона(алгоритм сейчас не дам - занят, но к вечеру или завтра - попробую). Если и это не поможет, то тогда смирись - Excel вообще штука не быстрая. Пробовал. Выигрыш незначительный. |
Сообщ.
#7
,
|
|
|
Этот вариант у меня сработал:
![]() ![]() 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 |
Сообщ.
#8
,
|
|
|
Ураааааа! Работает!
Сделал так: ![]() ![]() 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. Формула тоже вставляется. Только есть небольшая проблема. Как обновить значение в ячейке с автосумой? А то в ней прописывает 0. А у меня в сумируемых ячейках уже есть значения и их то и надо просумировать и показать пользователю. |
Сообщ.
#9
,
|
|
|
Попробуй Sheet.Calculate (или Range.Calculate) - он должен форсировать пересчет данных, но я не проверял.
|
Сообщ.
#10
,
|
|
|
Цитата Jureth, 29.09.04, 05:09 Попробуй Sheet.Calculate (или Range.Calculate) - он должен форсировать пересчет данных, но я не проверял. Работает. И еще два вопроса. 1. Как установить формат ячеек, то есть: ![]() ![]() ASheetRef.Range['A1:A86'].NumberFormat:='# ###0.0'; 2. И как присвоить имя книге: ![]() ![]() ExcelApp:=CreateOleObject('Excel.Application'); ExcelApp.Visible:=true; WBRef:=ExcelApp.Workbooks.Add; WBRef.Name:='Some name'; Вылетает ошибка и в первом и во втором случае. Искал в инете - ничего толкового не могу найти. У меня нету этой чертовой справки ВБ. |
Сообщ.
#11
,
|
|
|
1. Не знаю - не делал.
2. Это свойство - ReadOnly, установить его можно только при сохранении книги (WBRef.SaveAs) Цитата Переустановил бы Офис - ради разработки приложения можно и попотеть немного. У меня нету этой чертовой справки ВБ |
Сообщ.
#12
,
|
|
|
Понял. Еще раз спасибо.
|
![]() |
Сообщ.
#13
,
|
|
Цитата Jureth, 4.10.04, 08:46 Переустановил бы Офис - ради разработки приложения можно и попотеть немного. офис можно и доустановить, не удаляя его полностью ![]() |
Сообщ.
#14
,
|
|
|
Вот так работает:
![]() ![]() 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'; |