使用 MATLAB 执行 Excel What-If 目标寻求分析

问题描述 投票:0回答:1

我有一个 MATLAB 代码,它将数据复制到 Excel 文件并运行数百个公式(对于任何感兴趣的人,我正在使用 NREL 开发的 CREST 修订版)。之后,我想使用 Excel 中的目标搜索功能运行假设分析,以找到产品的最低成本。

由于电子表格的复杂性,我无法(及时)在 MATLAB 中重新创建公式。假设分析是手动进行的,但我想对数千个文件运行目标搜索。有没有办法使用 MATLAB 来执行此操作?我想打开电子表格,运行目标搜索,保存并关闭文件,并对数千个文件执行此操作。除了执行目标寻求之外,我知道如何做所有事情。

谢谢!

excel matlab
1个回答
0
投票

MSDN VBA 文档通常是有关如何从 MATLAB 以编程方式控制 Excel 的良好参考,因为 Excel 的 COM 接口的语法与 VBA 紧密一致。

特别是来自 GoalSeek VBA 文档:

https://learn.microsoft.com/en-us/previous-versions/office/developer/office-2003/aa195749(v=office.11)

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
© www.soinside.com 2019 - 2024. All rights reserved.