我有一个 MATLAB 代码,它将数据复制到 Excel 文件并运行数百个公式(对于任何感兴趣的人,我正在使用 NREL 开发的 CREST 修订版)。之后,我想使用 Excel 中的目标搜索功能运行假设分析,以找到产品的最低成本。
由于电子表格的复杂性,我无法(及时)在 MATLAB 中重新创建公式。假设分析是手动进行的,但我想对数千个文件运行目标搜索。有没有办法使用 MATLAB 来执行此操作?我想打开电子表格,运行目标搜索,保存并关闭文件,并对数千个文件执行此操作。除了执行目标寻求之外,我知道如何做所有事情。
谢谢!
MSDN VBA 文档通常是有关如何从 MATLAB 以编程方式控制 Excel 的良好参考,因为 Excel 的 COM 接口的语法与 VBA 紧密一致。
特别是来自 GoalSeek VBA 文档:
Worksheets("Sheet1").Range("Polynomial").GoalSeek _
Goal:=15, _
ChangingCell:=Worksheets("Sheet1").Range("X")
我们可以在 MATLAB 中执行此操作,如下所示:
workbookName = 'Test.xlsx';
sheetName = 'Sheet1';
goalseekAddr = 'C3';
goalseekVal = 15;
changeAddr = 'B3';
sheet = getSheet( workbookName, sheetName );
changeCell = sheet.Range(changeAddr);
invoke( sheet.Range(goalseekAddr), 'GoalSeek', goalseekVal, changeCell );
您必须使用
invoke
来调用 GoalSeek 函数,但否则它会在相同的输入上运行
getSheet
是我编写的一个辅助函数,但是您可能已经有了通过 sheet
获取
actxserver
COM 对象的东西
辅助功能
function sheet = getSheet( workbookName, sheetName )
% Try and connect to open Excel instance, open a new one if not
try
Excel = actxGetRunningServer('Excel.Application');
catch
Excel = actxserver('Excel.Application');
end
% Find the workbook by name
workbook = [];
for iwb = 1:Excel.Workbooks.Count
if strcmpi( workbookName, Excel.Workbooks.Item(iwb).Name )
workbook = Excel.Workbooks.Item(iwb);
break;
end
end
if isempty(workbook)
Excel.Workbooks.Open( workbookName );
end
% Assume the sheet exists...
sheet = workbook.Sheets.Item(sheetName);
end