Конференция "Corba" » Delphi->Сервис->Анализ данных->Регрессия [Delphi, Windows]
 
  • timonissimo © (23.05.07 14:57) [0]
    Возможно-ли сделать так:

    Из Delphi создаем книгу excel
    Заполняем определенные ячейки данными
    Вызываем "Сервис->Анализ данных->Регрессия"
    Передаем параметрам соотвествующие значения
    Считываем результат

    Короче, можно все это сделать, даже не показывая Excel пользователю?
  • umbra © (23.05.07 15:15) [1]
    анализ данных - это надстройка экселя, т.е. отдельная длл. Из экселя ее можно только вызвать, управлять ей нельзя.
  • timonissimo © (23.05.07 16:28) [2]
    А если у меня в книге есть макрос на vba - можно его как-то активировать?
  • timonissimo © (23.05.07 16:32) [3]
    мне просто надо построить уравнение регрессии, можно в принципе в само 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, &#8242;&#8242;, SeriesColor)
         else
           DestSeries.AddXY(SourceSeries.XValues.Value[i],
             b1 * SourceSeries.XValues.Value[i] + b0, &#8242;&#8242;, SeriesColor);
     if b0 < 0 then
       s := &#8242;&#8242;
     else
       s := &#8242;+ &#8242;;
     Hint := Format(&#8242;%0.3f&#8242;, [b1]) + &#8242;*X &#8242; + s + Format(&#8242;%0.3f&#8242;, [b0]);
     x := nil;
     y := nil;
    end;

  • Сергей М. © (24.05.07 11:03) [4]

    > можно его как-то активировать?


    Можно.

    см. метода ExcelApplication.Run()
  • timonissimo © (24.05.07 12:59) [5]

    > Можно.см. метода ExcelApplication.Run()


    А можно, плз, чуть подробнее...
  • Сергей М. © (24.05.07 14:30) [6]

    > А можно, плз, чуть подробнее


    А можно, плз, для начала почитать справку к методу, а потом задавать вопросы о непонятом в прочитанном ? Или хотя бы погуглить для начала на упомянутую тему ?
  • timonissimo © (24.05.07 15:01) [7]

    > А можно, плз, для начала почитать справку к методу, а потом
    > задавать вопросы о непонятом в прочитанном ? Или хотя бы
    > погуглить для начала на упомянутую тему ?

    Да я искал... неправильно...
    надо было три слова отдельно писать.
    Буду теперь все просматривать
  • timonissimo © (29.05.07 09:58) [8]
    Во как придумал... Написал макрос

    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?
  • Сергей М. © (29.05.07 10:02) [9]
  • timonissimo © (29.05.07 11:48) [10]
    Спасибо! Почитаем... а то искал через Яндекс - не много нашел
  • timonissimo © (30.05.07 10:29) [11]
    Блина, никак не получается...
    Вопрос первый: какую книгу загружать: 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, как точно задать параметры???
  • Сергей М. © (30.05.07 12:13) [12]
    Excel какой версии ?
    Как импортировал библ-ку типов ?
  • timonissimo © (30.05.07 14:32) [13]
    1. Excel какой версии - 2003
    2. Ничего не импортировал.
  • Сергей М. © (30.05.07 14:56) [14]
    т.е. в uses у тебя указан ExcelXP ?

    Тогда почему не используешь overload-версию метода TExcelApplication.Run с нужным тебе кол-вом аргументов ?
  • timonissimo © (30.05.07 15:22) [15]
    Да, ExcelXP
    А как использовать overload-версию?
    И вопрос то вот еще в чем: почему сначала макрос из excel запускался, а теперь перестал,  выдает ошибку 10004 - "файл ATPVBAEN.XLA не найден, хотя файл я не трогал (на самом деле я его скопировал в папку с программой, но потом все вернул как было)
  • Сергей М. © (30.05.07 15:27) [16]

    > как использовать overload-версию?


    emacros.Run(нужное кол-во параметров, от 0 до 30)


    > а теперь перестал


    Проверь, что xla-модуль фигурирует в списке установленных настроек
  • timonissimo © (30.05.07 15:34) [17]
    т.е. у меня было emacros.Application.Run, а теперь без Application?
    xla-модуль фигурирует, так как если строить регрессию через "сервис-анализ данных-регрессия", то все нормально. Через макрос не находит!
    Когда ошибки не было, я запускал
    emacros.Application.Run( 'Макрос2', 30 параметров) (30-иначе если ругается) но была ошибка, что не совпадается количество параметров
  • Сергей М. © (30.05.07 16:19) [18]

    > т.е. у меня было emacros.Application.Run, а теперь без Application?


    Да.


    > emacros.Application.Run( 'Макрос2', 30 параметров) (30-иначе
    > если ругается) но была ошибка, что не совпадается количество
    > параметров


    Конечно не будет совпадать !

    Записанный тобой макрос 'Макрос2' не имеет параметров.

    Нужно вызывать макрос 'ATPVBAEN.XLA!Regress' (а не 'Макрос2') и ему передавать те самые 12 параметров
  • timonissimo © (30.05.07 17:26) [19]
    т.е. так?

    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)
 
Конференция "Corba" » Delphi->Сервис->Анализ данных->Регрессия [Delphi, Windows]
Есть новые Нет новых   [134430   +4][b:0][p:0.003]