-
Возможно-ли сделать так:
Из Delphi создаем книгу excel Заполняем определенные ячейки данными Вызываем "Сервис->Анализ данных->Регрессия" Передаем параметрам соотвествующие значения Считываем результат
Короче, можно все это сделать, даже не показывая Excel пользователю?
-
анализ данных - это надстройка экселя, т.е. отдельная длл. Из экселя ее можно только вызвать, управлять ей нельзя.
-
А если у меня в книге есть макрос на vba - можно его как-то активировать?
-
мне просто надо построить уравнение регрессии, можно в принципе в само delphi рассчитать, но вот тока я исходников не нашел, самому писать долго, думал, может через excel получиться... Нашел вот это, да тока не могу разобраться: procedure LinearRegression(ValueArray, ArgumentArray: TDoubleArray;
SourceSeries, DestSeries: TChartSeries;
var MainCoef, FreeCoef: double; SeriesColor: TColor; var Hint: string);
var
b0, b1, xsum, ysum, pxy, xsqua: double;
y, x: array of double;
i, N: integer;
s: string;
begin
if ValueArray <> nil then
N := Length(ValueArray)
else
N := SourceSeries.XValues.Count;
pxy := 0;
xsqua := 0;
SetLength(x, N);
SetLength(y, N);
for i := 0 to N - 1 do
begin
if ValueArray <> nil then
begin
y[i] := ValueArray[i];
x[i] := ArgumentArray[i];
end
else
begin
y[i] := SourceSeries.YValues.Value[i];
x[i] := SourceSeries.XValues.Value[i];
end;
pxy := pxy + x[i] * y[i];
xsqua := xsqua + x[i] * x[i];
end;
xsum := Sum(x);
ysum := Sum(y);
b1 := (xsum * ysum - N * pxy) / (xsum * xsum - N * xsqua);
b0 := (ysum - b1 * xsum) / N;
MainCoef := b1;
FreeCoef := b0;
if DestSeries <> nil then
for i := 0 to N - 1 do
if ValueArray <> nil then
DestSeries.AddXY(ArgumentArray[i],
b1 * ArgumentArray[i] + b0, ′′, SeriesColor)
else
DestSeries.AddXY(SourceSeries.XValues.Value[i],
b1 * SourceSeries.XValues.Value[i] + b0, ′′, SeriesColor);
if b0 < 0 then
s := ′′
else
s := ′+ ′;
Hint := Format(′%0.3f′, [b1]) + ′*X ′ + s + Format(′%0.3f′, [b0]);
x := nil;
y := nil;
end;
-
> можно его как-то активировать?
Можно.
см. метода ExcelApplication.Run()
-
> Можно.см. метода ExcelApplication.Run()
А можно, плз, чуть подробнее...
-
> А можно, плз, чуть подробнее
А можно, плз, для начала почитать справку к методу, а потом задавать вопросы о непонятом в прочитанном ? Или хотя бы погуглить для начала на упомянутую тему ?
-
> А можно, плз, для начала почитать справку к методу, а потом > задавать вопросы о непонятом в прочитанном ? Или хотя бы > погуглить для начала на упомянутую тему ?
Да я искал... неправильно... надо было три слова отдельно писать. Буду теперь все просматривать
-
Во как придумал... Написал макрос Sub Макрос2()
Application.Run "ATPVBAEN.XLA!Regress", ActiveSheet.Range("$A$5:$A$23"), _
ActiveSheet.Range("$B$5:$E$23"), False, False, , ActiveSheet.Range("$I$5") _
, True, False, False, False, , False
End Sub Теперь тока вопрос: как вызвать его из delphi, при этом задав еще и параметры ActiveSheet.Range?
-
-
Спасибо! Почитаем... а то искал через Яндекс - не много нашел
-
Блина, никак не получается... Вопрос первый: какую книгу загружать: ATPVBAEN.XLA или ту, в которой я писал vba макрос? Вопрос второй: что писать в первом параметре ATPVBAEN.XLA или "макрос2"? Короче, я сделал так: emacros.Workbooks.Open(getcurrentdir+'\прогнозирование.xls',emptyparam,emptyparam,
emptyparam,emptyparam,emptyparam,emptyparam,emptyparam,emptyparam,
emptyparam,emptyparam,emptyparam,emptyparam,emptyparam,emptyparam,0);
emacros.Application.Run( 'Макрос2' , '$A$5:$A$23','$B$5:$E$23', False, False, emptyparam,'$I$5', True, False, False, False, emptyparam, False,emptyparam,emptyparam,emptyparam,emptyparam,emptyparam,emptyparam, emptyparam,emptyparam,emptyparam,emptyparam,emptyparam,emptyparam, emptyparam,emptyparam,emptyparam,emptyparam,emptyparam,emptyparam); Хотя в макросе на самом деле 12 параметров, Делфи ругался до тех пор, пока я не довел число параметров до 30. После этого при запуске начал ругаться уже vba - типа несоответствие в параметрах. Ладно, попробовал теперь уже в vba переправить и довести число параметров до 30 - естественно не получилось. В довершении всего макрос перестал запускаться! выдает ошибку 10004 - "файл ATPVBAEN.XLA не найден!" Как не найден, на месте он! Просто из меню регрессия запускается, переписал макрос - та же фигня! Попробовал на другом компе - работает макрос... Excel что-ли переустановить... Короче, подскажите, плз, как запустить этот макрос из delphi, как точно задать параметры???
-
Excel какой версии ? Как импортировал библ-ку типов ?
-
1. Excel какой версии - 2003 2. Ничего не импортировал.
-
т.е. в uses у тебя указан ExcelXP ?
Тогда почему не используешь overload-версию метода TExcelApplication.Run с нужным тебе кол-вом аргументов ?
-
Да, ExcelXP А как использовать overload-версию? И вопрос то вот еще в чем: почему сначала макрос из excel запускался, а теперь перестал, выдает ошибку 10004 - "файл ATPVBAEN.XLA не найден, хотя файл я не трогал (на самом деле я его скопировал в папку с программой, но потом все вернул как было)
-
> как использовать overload-версию?
emacros.Run(нужное кол-во параметров, от 0 до 30)
> а теперь перестал
Проверь, что xla-модуль фигурирует в списке установленных настроек
-
т.е. у меня было emacros.Application.Run, а теперь без Application? xla-модуль фигурирует, так как если строить регрессию через "сервис-анализ данных-регрессия", то все нормально. Через макрос не находит! Когда ошибки не было, я запускал emacros.Application.Run( 'Макрос2', 30 параметров) (30-иначе если ругается) но была ошибка, что не совпадается количество параметров
-
> т.е. у меня было emacros.Application.Run, а теперь без Application?
Да.
> emacros.Application.Run( 'Макрос2', 30 параметров) (30-иначе > если ругается) но была ошибка, что не совпадается количество > параметров
Конечно не будет совпадать !
Записанный тобой макрос 'Макрос2' не имеет параметров.
Нужно вызывать макрос 'ATPVBAEN.XLA!Regress' (а не 'Макрос2') и ему передавать те самые 12 параметров
-
т.е. так?
emacros.Workbooks.Open(ATPVBAEN.XLA); emacros.Application.Run('ATPVBAEN.XLA!Regress' , '$A$5:$A$23','$B$5:$E$23', False, False, emptyparam,'$I$5', True, False, False, False, emptyparam, False)
|