Страница 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;