使用VBA计算协方差矩阵

使用VBA计算协方差矩阵

问题描述:

我需要关于协方差计算的帮助/指导。我写了下面的程序来计算10年股票数据的协方差。问题是我收到一个错误,指出下标超出范围。我打电话的功能的方式是使用VBA计算协方差矩阵

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 
+0

我也尝试删除for循环,看看它是否计算covar或不,这并没有给我任何错误,实际上打印#DIV/0! – 2013-03-20 14:30:26

+0

我认为你必须检查你传递给sub = ie的参数。确保你的行/列以1开头而不是0. – 2013-03-20 14:37:03

+0

也检查整数的变量,它们的最大值约为32000 – 2013-03-20 15:05:10

如果您在下方出现错误,请确保文件名是正确的,并且文件存在于您的硬盘驱动器上并且处于打开状态。

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

使用选项基本1条上的代码顶部和改变以下线

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

另外,还要确保你的输入变量是大于0

从此亲切指定的行号以及当你发布任何错误的问题。如果可能,截图这将有助于您的查询更快解决。

rowPrint开始在5号线的功能,同时secondPick开始的行4 这意味着cvaluePrint包含的项目少于secondValue。

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

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

当您执行行循环时,它从1到2870But当您键入cvaluePrint(行+ 1,1)时,您正在调用从2到2871. 最后一行超出范围。 使用cvaluePrint(行,1)

变化

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

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

由于UBound(cvaluePrint) = 2870,所以当Row = 2870Row + 1超过上限的变异cvaluePrint在for循环的最后迭代。