excel - 使用 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
解决方案
如果你极度简化你的公式,就像这样:
那么,这是将其表示为 VBA 函数并在 Excel 中调用它的正确方法:
Public Function SimpleMultiplication(matrix1 As Range, matrix2 As Range) As Variant
SimpleMultiplication = WorksheetFunction.MMult(matrix1, matrix2)
End Function
该函数返回一个变量,而不是一个范围。Set
并且在您的代码中,当要分配类型为 range 的对象时,请确保始终使用关键字。一般来说,如果你想通过一个中间范围并分配它,那么最好使用一个数组并从那里获取数字 -从 VBA 中的范围创建一个数组
推荐阅读
- angular - 离子标签中加载图像失败的错误事件
- wordpress - 如何使用 Contact Form 7 和 WP Mail SMTP 分配 SendGrid 类别
- excel - VBA循环遍历范围,如果匹配:将部分行和特定列标题附加到新工作表中的表
- ember.js - 如何使用其他查询参数重新加载模型?
- node.js - 我可以将前端应用程序放在 Heroku 的外部文件夹中并根据要求提供吗?
- android - recyclerview 中的 Seekbar 也会移动 recyclerview
- r - 在 R 中绘制 cox 回归的交互作用
- flutter - 如何使用flutter_google_ad_manager插件在onAdFailedToLoad事件的情况下呈现不同的小部件?
- python - 如何在python中解析非键值json文件
- spring - 使用 Spring Cloud 函数 AWS Adapter 运行 AWS lambda 函数时,spring 不会注入(自动装配)组件 bean