Здравствуйте, товарищи! Я еще новичок и у меня возник, думаю простой для Вас вопрос. Есть такой код(для передачи данных из БД 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;
Как можно сделать циклическое присваивание формулы(с левой частью вроде понятно-оставить так как есть, а вот что нужно сделать с правой)?
Читал ЧАВО по Excel, но там такого не нашел.
Заранее благодарен.
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
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;
Оба они выполняются меньше секунды (в вопросе веть нету информации по поводу обёмов передаваемых данных).
Ваши высказывания по поводу того, какой вы крутой знаток 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 пришлось ещё разбиратся.
Shabal! Респект тебе! Ты дал очень полезные ссылки для меня! Я почитал, что там написано и понял что для твоего метода значительно нужно меньше кода и естественно он более эффективный! Переделал по твоему совету. Большое СПАСИБО! Буду стараться дальше познавать всякие тонкости!
2 Автор
Проблема была решена так, как подсказал Марат.
Не путайте пожалуйста решение пролемы и отложение её решения на будущее. Это две абсолютно разные вещи. Фундаментально займитесь изучением той технологии, которую используете. ИМХО, Shabal абсолютно прав. У меня нет повода недоверять ему.
05-07-2006 07:51 | Комментарий к предыдущим ответам
Хочу еще добавить, что лучше всего использовать возможности и мощ самого Excel'я, а не городить венегрет типа "Sheet.Cells[index,8].Formula:='=' + Adr1 + '+' + Adr2;"...
05-07-2006 07:39 | Комментарий к предыдущим ответам
Много знать это хорошо, но иногда для решения маленькой задачи заниматся серьёзным изучением предметной облости, это всёравно, что стрелять из пушки по воробям.
Не думаю что кому-нибудь помешает знание основ работы в электронной таблице Excel. И считаю что даже маленькие задачи нужно решать правильно и оптимально, а не топорно. Честно говоря, разочарован вашими ответами.
Во-первых, грозят страшные тормоза.
Во-вторыхЮ автору вопроса не мешало бы разобраться в стилях адресации A1 и R1C1, а также в понятии абсолютного и относительного адреса.
Тормоза грозят при превышении определённого обёма данных, похоже в данном варианте тормоза не грозят.
Много знать это хорошо, но иногда для решения маленькой задачи заниматся серьёзным изучением предметной облости, это всёравно, что стрелять из пушки по воробям.
Мдя уж... Видимо Марат тоже в поздном связывается...
Во-первых, грозят страшные тормоза.
Во-вторыхЮ автору вопроса не мешало бы разобраться в стилях адресации A1 и R1C1, а также в понятии абсолютного и относительного адреса.
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.