Страница 1 из 1
Макросы в функциях эксель
Добавлено: 20 апр 2010, 10:45
Алексей
В общем есть сформированный функциями отчет в эксель.
Есть желание подбить итоги которые в эксель вызываются по меню "Данные - итоги".
Подобных функций не нашел и решил оформить это макросом.
Но по скольку заранее не знаю какое кол-во строк в отчёте будет - то и макрос соответственно не постоянен и должен формироваться на ходу.
Вопрос: есть ли возможность не загружать макрос из файла или запускать уже описанный в шаблоне а напрямую из ВИПа командами передать построчно макрос и выполнить его?
Добавлено: 20 апр 2010, 10:50
m0p3e
Файл с макросом нужно динамически построчно формировать из VIP-а.
Добавлено: 20 апр 2010, 22:39
edward_K
или запускать макрос с параметром. Еще вариант - в какой нибудь скрытой(белой) ячейке писать требуемое число. Все таки в шаблоне держать макрос проще.
Re: Макросы в функциях эксель
Добавлено: 21 апр 2010, 08:33
ilshat
Алексей писал(а):
Но по скольку заранее не знаю какое кол-во строк в отчёте будет
Давно не писал макросов, но помнится есть там возможность определить границу ареала данных т.е. где ж они кончаются на листе.
Re: Макросы в функциях эксель
Добавлено: 21 апр 2010, 09:14
Den
ilshat писал(а):Алексей писал(а):
Но по скольку заранее не знаю какое кол-во строк в отчёте будет
Давно не писал макросов, но помнится есть там возможность определить границу ареала данных т.е. где ж они кончаются на листе.
Определить можно с помощью GetUsedRange, но это когда уже выгружены данные..
Добавлено: 21 апр 2010, 09:15
Алексей
спсб. сделал через файл всё-таки. а по границе, да тупо вбил 65000

не промахнусь

Добавлено: 21 апр 2010, 10:44
m0p3e
Для справки. Может поможет

Большинство xl-функций в случае некорректного указания границ используют GetUserRange для определения границ. Пример:
Код: Выделить всё
function tExporter.InsertRange;
begin
Result := false;
if (not IsAllValid) then Exit;
try
if (RowU<=0) or (ColL<=0) or (RowD<=0) or (ColR<=0) then
WSheet.UsedRange.Insert(Shift := lShift)
else
WSheet.Range[WSheet.Cells[RowU, ColL], WSheet.Cells[RowD, ColR]].Insert(Shift := lShift);
LastError := cgxlOk; Result := True;
except
LogOnExcept('InsertRange');
LastError := cgxlErrInsertRange;
end
end;