使用VBA计算协方差矩阵

时间:2013-03-20 14:27:01

标签: excel vba excel-vba covariance

我需要关于协方差计算的帮助/指导。我编写了以下程序来计算10年库存数据的协方差。问题是我收到一个错误,说明下标超出范围。我调用函数的方式是

CalcCovarAll firstColPick:= 17,SecColPick:= 17,ColPrint:= 42

'firstColPick是第一列选择的地址

'secColPick是第二列选择的地址

'colPrint是将输出打印到单元格的特定列。

任何快速帮助都会非常有帮助。我想我没有正确实现这个功能

Sub CalcCovarAll(ByVal firstColPick As Integer, ByVal SecColPick As Integer, ByVal   ColPrint As Integer)
Dim secondPick As Range
Dim secondValue As Variant
Dim firstPick As Range
Dim firstValue As Variant
Dim wksSheet As Worksheet

Dim rowPrint As Range
Dim cvaluePrint As Variant

Dim Row As Integer
Dim col As Integer

'setting up the active worksheet
Set wksSheet = Workbooks("VaR_cw2 (2).xlsm").Worksheets("Sheet1")
'setting up the pickup of first column
Set firstPick = Range(Cells(4, firstColPick), Cells(2873 + 1, firstColPick))
firstValue = firstPick.Value

'setting up pickup of second column
Set secondPick = Range(Cells(4, SecColPick), Cells(2873 + 1, SecColPick))
 secondValue = secondPick.Value
'setting up column printing
Set rowPrint = Range(Cells(5, ColPrint), Cells(2873 + 1, ColPrint))
cvaluePrint = rowPrint.Value

 For Row = LBound(secondValue) To UBound(secondValue) - 1
    cvaluePrint(Row + 1, 1) = Application.Covar(firstValue, secondValue)
Next Row

rowPrint = cvaluePrint
End Sub

3 个答案:

答案 0 :(得分:0)

rowPrint从第5行开始,而secondPick从第4行开始。 这意味着cvaluePrint包含的项目小于secondValue。

cvaluePrint(1到2870)(5到2874 - VBA中的所有数组从1开始,而不是从5开始)

secondValue(1到2871)(4到2874 - VBA中的所有数组从1开始,而不是从4开始)

当你执行Row循环时,它从1到2870但是当你输入cvaluePrint(Row + 1,1)时,你从2到2871调用。 最后一行超出了范围。 使用cvaluePrint(Row,1)

答案 1 :(得分:0)

如果您在下面的行中收到错误,请确保文件名正确,并且该文件存在于您的硬盘驱动器上并且已打开。

Set wksSheet = Workbooks("VaR_cw2 (2).xlsm").Worksheets("Sheet1")

在代码顶部使用 Option Base 1 并更改以下行

For Row = LBound(secondValue) To UBound(secondValue) 
    cvaluePrint(Row + 1, 1) = Application.Covar(firstValue, secondValue)
Next Row

还要确保输入变量大于0。

此后,当您针对任何错误发布任何问题时,请同时指定行号。截屏如果可能。它可以帮助您的查询更快地解决。

答案 2 :(得分:0)

更改

cvaluePrint(Row + 1, 1) = Application.Covar(firstValue, secondValue)

cvaluePrint(Row, 1) = Application.Covar(firstValue, secondValue)

UBound(cvaluePrint) = 2870起,所以当Row = 2870Row + 1超过for循环最后一次迭代中变体cvaluePrint的上限时。