【问题标题】:Dividing matrices using a VBA function使用 VBA 函数划分矩阵
【发布时间】:2019-02-28 12:10:23
【问题描述】:

对 VBA 非常陌生,所以如果这是一个非常简单的问题,我们深表歉意。这是与财务/投资组合管理相关的。

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

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

映射矩阵的维度没有问题(如果 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

【问题讨论】:

  • Range 是 VBA 中的一个对象。因此,它需要关键字set。它也应该设置为一个对象。

标签: excel vba matrix


【解决方案1】:

如果你极度简化你的公式,变成这样:

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

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

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

【讨论】:

    猜你喜欢
    • 2015-07-29
    • 2011-12-29
    • 1970-01-01
    • 2013-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-12
    相关资源
    最近更新 更多