Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Круглый стол
  
Правила КС
>> Настройки

Фильтр вопросов
>> Новые вопросы
отслеживать по
>> Новые ответы

Избранное

Страница вопросов
Поиск по КС


Специальные проекты:
>> К л ю к в а
>> Г о л о в о л о м к и

Вопрос №

Задать вопрос
Off-topic вопросы

Помощь

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  13:49[Войти] | [Зарегистрироваться]
Ответ на вопрос № 43653

05-07-2006 05:05
Здравствуйте, товарищи! Я еще новичок и у меня возник, думаю простой для Вас вопрос. Есть такой код(для передачи данных из БД FireBird в Excel,Delphi7):


index:=3;
for i:=0 to DataModule1.ResultViewTable.RecordCount-1 do
begin
//тут передача данных из БД
Sheet.Cells[index,8].Formula:='=E5+F5'; //эта формула работает нормально
Inc(Index);
DataModule1.ResultViewTable.Next;
end;


Нужно каким-то образом привести к такому виду:

Sheet.Cells[index,8].Formula:='=[index,5]+[index,6]';


Как можно сделать циклическое присваивание формулы(с левой частью вроде понятно-оставить так как есть, а вот что нужно сделать с правой)?
Читал ЧАВО по Excel, но там такого не нашел.
Заранее благодарен.

[+] Добавить в избранные вопросы

Отслеживать ответы на этот вопрос по RSS

Ответы:


Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице.
Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.

09-07-2006 06:35
»вопрос КС №34775« »вопрос КС №39266« »вопрос КС №40432« »вопрос КС №42521« »вопрос КС №43573«

06-07-2006 22:49 | Комментарий к предыдущим ответам
По поводу VBA я наверно перегнул (как построен VBA из нутрии мне не ведомо :) ). Но всё равно позднее связывание используется во многих продуктах (в том числе и в VBA) и работает вполне стабильно.

06-07-2006 22:32 | Комментарий к предыдущим ответам
to Shabal
>>>Смотрите на MSDN (там еще вспоминают о счастливых пользователях ваших программ :-D).
Пожалуйста будьте внимательны к высказываниям, мои программы выполняют экспорт в Excel с высокой скоростью на сколько позволяет Excel при достаточно больших объёмах сотни строк и больше десятка столбцов (конечно используется пакетная передача данных).
>>>А если нет инфы по объему данных, то это не значит что будет всегда только 11 строк...
Кстати строк не 11, а 10. Почему я решил что объемы не большие по тому, что автор не задаёт вопрос почему медленно работает он задаёт вопрос как сделать, а вить построчно заполняется не только формулы но и данные.
>>>ЗЫ Попутный вопрос - в каком стиле вернет адрес свойство Sheet.Cells[I, J - 1].Address? Он будет относительный или абсолютный? Сколько параметров у св-ва Range.Address? Будьте осторожны с поздним связыванием, не то ваш код может стать просто неуправляемым!
На данный вопрос я отвечать не буду откройте Help и прочитайте. По поводу позднего связывания, весь VBA построен на позднем связывании и что теперь давайте не будем пользоваться VBA.
>>>ЗЗЫ К стати в последнем тестовом коде Sheet.Range[Sheet.Cells.Item[2, 2], Sheet.Cells.Item[11, 11]].Formula:='=RC[-1]+R[-1]C'; ошибка.
Ошибки нет, весь код проверен на Office2003. Excel самостоятельно определяет в каком стиле
передаются ссылки.

06-07-2006 09:11 | Комментарий к предыдущим ответам
Эх, Shabal. Вы ни как не можете понять, что решение задачи зависит от её условий. Я веть не писал, что мой вариант лучше вашего.

Был у меня случай что таки пришлось заносить данные построчно, но это было связавно со странным поведением в адресации к ячейкам при включенном автофильтре. Но вообще рекомендовано (это не я рекомендую) выполнять групповые операции - так будет намного быстрее. Не верите? - Смотрите на MSDN (там еще вспоминают о счастливых пользователях ваших программ :-D).

Оба они выполняются меньше секунды (в вопросе веть нету информации по поводу обёмов передаваемых данных).

При малом количестве данных верю что так и есть ;)
А если нет инфы по объему данных, то это не значит что будет всегда только 11 строк... Помнится кому то 65536 было мало (аппетит приходит во время еды?).

Ваши высказывания по поводу того, какой вы крутой знаток Excel, а мы тут лохи оскорбительны. Будь те более уважительны и терпеливы!!!

Бывает - извините что можно так интерпретировать мой ответ.

ЗЫ Попутный вопрос - в каком стиле вернет адрес свойство Sheet.Cells[I, J - 1].Address? Он будет относительный или абсолютный? Сколько параметров у св-ва Range.Address? Будьте осторожны с поздним связыванием, не то ваш код может стать просто неуправляемым!

ЗЗЫ К стати в последнем тестовом коде Sheet.Range[Sheet.Cells.Item[2, 2], Sheet.Cells.Item[11, 11]].Formula:='=RC[-1]+R[-1]C'; ошибка.

06-07-2006 02:58 | Комментарий к предыдущим ответам
>>>Эх, Марат... Если внимательно прочитать мой первый ответ, то я предлагал вписать формулу сразу во всю область ячеек,
Эх, Shabal. Вы ни как не можете понять, что решение задачи зависит от её условий. Я веть не писал, что мой вариант лучше вашего. Вот вам другие варианты тестов.

    for I:=2 to 11 do
    begin
      for J := 2 to 11 do
        Sheet.Cells[I, J].Formula:=Format('=%s+%s+%d', [Sheet.Cells[I, J - 1].Address,
          Sheet.Cells[I - 1, J].Address, Random(1000)]);
    end;


    Sheet.Range[Sheet.Cells.Item[2, 2], Sheet.Cells.Item[11, 11]].Formula:='=RC[-1]+R[-1]C';

Оба они выполняются меньше секунды (в вопросе веть нету информации по поводу обёмов передаваемых данных).
Ваши высказывания по поводу того, какой вы крутой знаток Excel, а мы тут лохи оскорбительны. Будь те более уважительны и терпеливы!!!

06-07-2006 01:45 | Комментарий к предыдущим ответам
К тому же хочу сказать, что используя метод Range.Offset можно вписать во всю область фомулу, предложенную автором в вопросе. Но это для вашего с ним понимания уже вообще сложно :-D

06-07-2006 01:10 | Комментарий к предыдущим ответам
2 Марат Сафин

Эх, Марат... Если внимательно прочитать мой первый ответ, то я предлагал вписать формулу сразу во всю область ячеек, а не в каждую строку отдельно. Переделай так код и сравни скорость.

05-07-2006 23:22 | Комментарий к предыдущим ответам
Я тут решил провести эксперимент по поводу позднего связывания с Excel и моего метода получения адреса и метода Shabal и вот что получилось
Мой вариант с поздним связиванием и получением адресса из Excel

    for I:=1 to 1000 do
    begin
      for J := 2 to 21 do
        Sheet.Cells[I, J].Formula:=Format('=%s+%d', [Sheet.Cells[I, J - 1].Address, Random(1000)]);
    end;


У меня ваполнялся 54 секунды.
Вариант с рекомендациями Shabal использование интерфейсов и относительнная адрисация.

    for I:=1 to 1000 do
    begin
      for J := 2 to 21 do
        Sheet.Cells.Item[I, J].Formula:='=RC[-1]+' + IntToStr(Random(1000));
    end;


Выполялся 51 секунду.
Разница во времени состовляет ~6% и из-за 6 процентов столько разговоров :(((.
Тем более автор вопроса мой вариант сразу понял, а в варианте Shabel пришлось ещё разбиратся.

05-07-2006 10:15 | Сообщение от автора вопроса
Shabal! Респект тебе! Ты дал очень полезные ссылки для меня! Я почитал, что там написано и понял что для твоего метода значительно нужно меньше кода и естественно он более эффективный! Переделал по твоему совету. Большое СПАСИБО! Буду стараться дальше познавать всякие тонкости!

05-07-2006 08:50
About cell and range references
http://office.microsoft.com/en-us/assistance/HP051983231033.aspx

05-07-2006 08:25 | Комментарий к предыдущим ответам
http://www.contextures.com/xlfaqApp.html
http://www.exceltip.com/

05-07-2006 08:05
2 Автор
Проблема была решена так, как подсказал Марат.
Не путайте пожалуйста решение пролемы и отложение её решения на будущее. Это две абсолютно разные вещи. Фундаментально займитесь изучением той технологии, которую используете. ИМХО, Shabal абсолютно прав. У меня нет повода недоверять ему.

С Уважением...

05-07-2006 07:55
2 Shabal
Честно говоря, разочарован вашими ответами.
Ну дык, конкурс ведь окончен, можно и расслабиться. ;)

05-07-2006 07:51 | Комментарий к предыдущим ответам
Хочу еще добавить, что лучше всего использовать возможности и мощ самого Excel'я, а не городить венегрет типа "Sheet.Cells[index,8].Formula:='=' + Adr1 + '+' + Adr2;"...

05-07-2006 07:43 | Комментарий к предыдущим ответам
Тормоза грозят при превышении определённого обёма данных, похоже в данном варианте тормоза не грозят.

Нужно вперед смотреть, а не думать что ложка в данной ситуации лучше
эксковатора.

05-07-2006 07:39 | Комментарий к предыдущим ответам
Много знать это хорошо, но иногда для решения маленькой задачи заниматся серьёзным изучением предметной облости, это всёравно, что стрелять из пушки по воробям.

Не думаю что кому-нибудь помешает знание основ работы в электронной таблице Excel. И считаю что даже маленькие задачи нужно решать правильно и оптимально, а не топорно. Честно говоря, разочарован вашими ответами.

05-07-2006 07:08
Во-первых, грозят страшные тормоза.
Во-вторыхЮ автору вопроса не мешало бы разобраться в стилях адресации A1 и R1C1, а также в понятии абсолютного и относительного адреса.

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

05-07-2006 06:51 | Комментарий к предыдущим ответам

Adr1:=Sheet.Cells[index,5].Address;
Adr2:=Sheet.Cells[index,6].Address;
Sheet.Cells[index,8].Formula:='=' + Adr1 + '+' + Adr2;


Мдя уж... Видимо Марат тоже в поздном связывается...

Во-первых, грозят страшные тормоза.
Во-вторыхЮ автору вопроса не мешало бы разобраться в стилях адресации A1 и R1C1, а также в понятии абсолютного и относительного адреса.

КУПИ КНИГУ по Microsoft Excel!

05-07-2006 06:16 | Сообщение от автора вопроса
Большое всем спасибо. Отдельный респект хотелось бы выразить Марату Сафину! Проблема была решена так, как подсказал Марат.

05-07-2006 05:39
Вот ещё вариант:
Adr1:=Sheet.Cells[index,5].Address;
Adr2:=Sheet.Cells[index,6].Address;
Sheet.Cells[index,8].Formula:='=' + Adr1 + '+' + Adr2;

05-07-2006 05:22
Sheet.Cells[index,8].FormulaR1C1 := '=RC[-3]+RC[-2]';

Вообще неплохо было бы записать формулу сразу во все строки

with Sheet do Range[Cells[1,8], Cells[DataModule1.ResultViewTable.RecordCount,8]].FormulaR1C1 := '=RC[-3]+RC[-2]';

Хотя with не сработает, т.к. связывание позднее :P

Читал ЧАВО по Excel, но там такого не нашел

Не мудрено - ЧаВо написан по работе с Excel из Delphi, а не описывает работу в Excel'е. Купите книгу по Excel'ю и изучайте.

ЗЫ В ЧаВо в конце статей есть моного ссылок на всевозможные FAQ и форумы по работе с Excel'ем

Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
Однажды, в студеную зимнюю пору я из лесу вышел, был сильный ЧТО?
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.
Тип сообщения:
Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве

    Страница избранных вопросов Круглого стола.
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования