ctrl shift输入数组

时间:2017-03-23 12:09:53

标签: arrays excel vba

我正在尝试创建一个宏,将组合的估计std dev返回给单元格。然而,作为股票的一部分,他们的covar以及他们的权重将基本上不断变化,并且我想在VBA中使用不同的投资组合(我的最终目标是尽可能简化报告)。

我似乎无法理解 ctrl + shift + 输入或sqr部分。

你可以看看我的代码帮帮我吗?

Sub PorteføljeRisiko()
Dim RapportBok As Workbook
Dim RapportArk As Worksheet
Set RapportBok = Workbooks("Rapport kunder")
Set RapportArk = RapportBok.Sheets(1)

Dim Region1 As Long
Dim RegionA As Long
Dim Matrise As Range

(因为股票的数量不同,我在这里找出实际包含一个值的行数(即每股的权重%))

Region1 = Application.WorksheetFunction.CountIf(RapportArk.Range("AC7:AC18"), "<>" & "")
RegionA = Region1 - 1 

(获得股票之间的covar矩阵,因为股票的变化与购买和出售股票有关。矩阵从单元格开始(3,55)

SisteKolonne = RapportArk.Cells(RegionA + 3, RegionA + 55)

Set Matrise = RapportArk.Range(Cells(3, 55), Cells(3 + RegionA, 55 + RegionA))

Set Region = RapportArk.Range("AC7:AC" & Region1 + 6)

(我希望结果在Range(“AG21”)中)

RapportArk.Range("AG21").FormulaArray = MMult(Application.MMult(Region, Matrise), Application.Transpose(Region))

(一切正常,除了它返回#VALUE!因为我似乎无法得到 ctrl + shift + 输入部分也不是宏中的SQR部分

End Sub

1 个答案:

答案 0 :(得分:6)

首先,您在VBA中计算的内容不是formula,而是value。除此之外,我无法验证您的所有计算,但我可以在这里看到问题:

  

Application.MMult(Region, Matrise)

尺寸不符合矩阵乘法的规则。通过分析代码,Region是一个大小为Region1的列向量,而Matrise是一个Region1 x Region1矩阵。

请记住,矩阵乘法不是可交换的。很可能你想要的是切换这些操作数的顺序:

Application.MMult(Matrise, Region)

这将为您提供大小为Region1的列向量。但是你想要一个带有向量Region的点积,这里再次出现行向量,所以你应该在第一个操作数上应用Transpose而不是在第二个。所以正确的陈述应该是:

RapportArk.Range("AG21").value = _
    Application.MMult(Application.Transpose(Application.MMult(Matrise, Region)), Region)

由于上一次操作是两个向量的dot-product,您可以使用SumProduct简化它:

RapportArk.Range("AG21").value = _
    Application.SumProduct(Application.MMult(Matrise, Region), Region)