我正在尝试在VBA中编写一个执行MATLAB的宏。打开时,MATLAB使用存储在excel表中的数据来记录宏。所以在VBA代码中我回忆起MATLAB函数并使用cell2mat
将数据从Excel转换为MATLAB。为了让我的生活更轻松,我将发布代码:
Public Sub USA()
Dim MatLab As Object
Set MatLab = CreateObject("MatLab.Desktop.Application")
MatLab.Execute ("cd('C:\Users\Dales\Dropbox\Esempi')")
Serie = Sheets("SP500").Range("B3:RU686")
Grupposector = Sheets("GruppoT").Range("B3:RU21")
GruppoMin = Sheets("Gruppo").Range("Z11:Z29")
GruppoMax = Sheets("Gruppo").Range("AA11:AA29")
ris = MatLab.PutWorkspaceData("prices", "base", Serie)
ris = MatLab.PutWorkspaceData("Grupposector", "base", Grupposector)
ris = MatLab.PutWorkspaceData("GruppoMin", "base", GruppoMin)
ris = MatLab.PutWorkspaceData("GruppoMax", "base", GruppoMax)
myResult = MatLab.Execute("[PortRisk, PortReturn, PortWts] = obama( cell2mat(prices, cell2mat(Grupposector), cell2mat(GruppoMin), cell2mat(GruppoMax));")
ris = MatLab.GetWorkspaceData("PortRisk", "base", PortRisk)
ris = MatLab.GetWorkspaceData("PortReturn", "base", PortReturn)
ris = MatLab.GetWorkspaceData("PortWts", "base", PortWts)
Sheets("SPottimizzazione").Range("a3:a18") = PortRisk
Sheets("SPottimizzazione").Range("b3:b18") = PortReturn
Sheets("SPottimizzazione").Range("e3:rx18") = PortWts
End Sub
现在当宏打开MATLAB时,它不会以双格式转换我的输入,但它们存储为字符串。
我哪里错了?
答案 0 :(得分:0)
您的问题是,正如您所说,您的数据是作为字符串导入的。直接致电cell2mat
将无效,因为它会将您的数据存储为char
。
为了解决您的问题,您需要做的是将单元格数组中的每个单元格转换为双倍,然后再将单元格转换为矩阵。
这可以通过致电:
来实现 myResult = MatLab.Execute("[PortRisk, PortReturn, PortWts] = obama(...
cell2mat(cellfun(@str2double,prices,'UniformOutput',false)),...
cell2mat(cellfun(@str2double,Grupposector,'UniformOutput',false)),...
cell2mat(cellfun(@str2double,GruppoMin,'UniformOutput',false)),...
cell2mat(cellfun(@str2double,GruppoMax,'UniformOutput',false)));")
当然,如果您的obama
函数需要双矩阵作为输入,这将有效。