首页 > 解决方案 > 使用 VBA 函数划分矩阵

问题描述

VBA 非常新,如果这是一个非常简单的问题,请道歉。这是与财务/投资组合管理相关的。

我想创建一个 VBA 函数,它可以为我提供一组资产的全局最小方差投资组合 (GMVP) 权重,其中仅包含资产的方差-协方差矩阵。

我可以将这个公式直接键入 Excel 上的单元格以获得权重:=MMULT(MINVERSE(S),Ones)/SUM(MMULT(MINVERSE(S),Ones))其中 S 是方差-协方差矩阵和一个是包含“1”的列矩阵

映射矩阵的维度没有问题(如果 S 是 5x5,那么那些将是 5x1)

我一直在尝试制作一个 VBA 函数,这样我就不必每次都输入冗长的公式来查找 GMVP。这是我的代码。在此之前,我还尝试将所有内容都写在一个很长的单行中,使用“/”来划分(没有用)

我想知道是不是因为我们不能使用“/”来划分VBA中的矩阵?有没有办法把公式变成函数?

谢谢!

Function GMVPcol(S As Range, Ones As Range) As Range
Dim num As Range
Dim dem As Range

num = Application.WorksheetFunction.MMult(Application.WorksheetFunction.MInverse(S), Ones)
dem = Application.WorksheetFunction.Sum(Application.WorksheetFunction.MMult(Application.WorksheetFunction.MInverse(S), Ones))

GMVPcol = Application.WorksheetFunction.MMult(num, Application.WorksheetFunction.MInverse(dem))

End Function

标签: excelvbamatrix

解决方案


如果你极度简化你的公式,就像这样:

在此处输入图像描述

那么,这是将其表示为 VBA 函数并在 Excel 中调用它的正确方法:

Public Function SimpleMultiplication(matrix1 As Range, matrix2 As Range) As Variant
    SimpleMultiplication = WorksheetFunction.MMult(matrix1, matrix2)
End Function

该函数返回一个变量,而不是一个范围。Set并且在您的代码中,当要分配类型为 range 的对象时,请确保始终使用关键字。一般来说,如果你想通过一个中间范围并分配它,那么最好使用一个数组并从那里获取数字 -从 VBA 中的范围创建一个数组


推荐阅读