Я должен запустить Excel Solver (GRG нелинейный) из PHP. Я использую расширение COM.
Когда я запускаю простой макрос из Excel или PHP (который не содержит инструкций решателя), сохраненный в файле Excel .xlsm, все работает нормально — макрос вносит некоторые простые изменения в ячейки в файле Excel, а затем сохраняет его как новый файл xls.
Проблема начинается, когда макрос содержит решающие инструкции (ничего сложного). Если такой макрос запускается из Excel, все работает нормально, как и раньше — работает Солвер. Но когда я пытаюсь запустить этот точный макрос, используя PHP с COM, возникает ошибка, которая:
«EXCEL SOLVER — ОШИБКА В МОДЕЛИ. ПОЖАЛУЙСТА, УБЕДИТЕСЬ, ЧТО ВСЕ КЛЕТКИ И ОГРАНИЧЕНИЯ ДЕЙСТВИТЕЛЬНЫ».
Я пробовал это на нескольких разных простых примерах, каждый раз с одинаковым эффектом (макрос запускается в Excel без проблем, и при запуске макроса из PHP возникает ошибка).
Код PHP:
<?php
//Remember to add in php.ini thius line : extension=php_com_dotnet.dll
$excel = new COM("excel.application") or die("Unable to instanciate excel"); //starting excel
print "Loaded excel, version {$excel->Version}<br><br>";
$excel->Visible = 0;//NOT //bring it to front
$excel->DisplayAlerts = 0; //dont want alerts ... run silent
$workBook = $excel->Workbooks->Open("Zeszyt1.xlsm"); //create a new workbook
$sheet=$workBook->Worksheets("Arkusz1"); //select the default sheet
$sheet->activate; //make it the active sheet
// run macro
$excel->Run("EqMacro");
$strPath = 'Zeszyt1_output1.xlsm'; // save the new file
$workBook->SaveAs($strPath);
$workBook->Close(false); //close the book
$excel->Workbooks->Close();
unset($sheet); //free up the RAM
$excel->Quit(); //closing excel
$excel = null; //free the object
?>
Макро EqMacro:
Sub EqMacro()
SolverOk SetCell:="$H$9", MaxMinVal:=3, ValueOf:=0, ByChange:="$D$6:$D$7", _
Engine:=1, EngineDesc:="GRG Nonlinear"SolverAdd CellRef:="$H$6", Relation:=2, FormulaText:="0"SolverAdd CellRef:="$H$7", Relation:=2, FormulaText:="0"
SolverSolve
End Sub
Ссылка на JPG с простой задачей для решения в Excel:
https://ibb.co/ehcxBy
Задача ещё не решена.
Других решений пока нет …