VBA函数在输出范围周围创建一个0层

时间:2015-10-24 21:33:03

标签: vba function covariance

我有以下宏和函数工作,但粘贴的结果在结果的左侧和顶部有一层零。希望你们能在我的代码中找出错误。我相信错误在函数中:

Sub AutoCovariance()

Dim DataRange As Range
Dim VarCovarOutPutRange As Range
Dim NumberOfReturns As Long
Dim NumberOfStocks As Long
Dim ArrayColumnsCounter As Double
Dim ArrayRowsCounter As Double
Dim ReturnsArray() As Double
Dim DataReturns() As Variant
Dim DataRowCounter As Long
Dim DataColumnCounter As Long
Dim Stock As Long
Dim dAutoCoVar() As Double

Set DataRange = ThisWorkbook.Worksheets(Sheet1.Name).ListObjects("DataTable").DataBodyRange

NumberOfReturns = ThisWorkbook.Worksheets(Sheet1.Name).ListObjects("DataTable").DataBodyRange.Rows.Count
NumberOfStocks = ThisWorkbook.Worksheets(Sheet1.Name).ListObjects("DataTable").Range.Columns.Count

ArrayColumnsCounter = 0
ArrayRowsCounter = 0
ReDim Preserve ReturnsArray(10, 1)

    ' Creating returns array
    For DataColumnCounter = 1 To NumberOfStocks
        ArrayRowsCounter = ArrayRowsCounter + 1

        For DataRowCounter = 1 To NumberOfReturns
            ArrayColumnsCounter = ArrayColumnsCounter + 1
            ReDim Preserve ReturnsArray(NumberOfStocks, ArrayColumnsCounter)

            For Stock = 1 To NumberOfStocks

                ReturnsArray(Stock, ArrayColumnsCounter) = DataRange(DataRowCounter, Stock).Value
            Next Stock

        Next DataRowCounter
        ArrayColumnsCounter = ArrayColumnsCounter - 100

    Next DataColumnCounter

' Transfer ReturnsArray Data to DataReturns
ReDim DataReturns(NumberOfReturns, NumberOfStocks)
DataReturns = Application.WorksheetFunction.Transpose(ReturnsArray)


' calculate the autocovariance matrix
dAutoCoVar = Autocovar(DataReturns)

' write to the worksheet, for debug
Set VarCovarOutPutRange = ThisWorkbook.Worksheets(Sheet1.Name).Range(Cells(1, NumberOfStocks + 2), Cells(NumberOfStocks, NumberOfStocks * 2 + 2))

VarCovarOutPutRange.Value = dAutoCoVar

End Sub

功能

Function Autocovar(DataReturns() As Variant) As Double()
Dim dArrResult() As Double
Dim j As Long, k As Long

' redim the result array as a square array.
ReDim dArrResult(1 To UBound(DataReturns, 2), 1 To UBound(DataReturns, 2))

' calculate the autocovariance matrix
For j = 1 To UBound(DataReturns, 2)
    For k = 1 To UBound(DataReturns, 2)
        With Application.WorksheetFunction
            dArrResult(j, k) = .Covariance_S(.Index(DataReturns, 0, j), .Index(DataReturns, 0, k))
        End With
    Next k
Next j
Autocovar = dArrResult
End Function

1 个答案:

答案 0 :(得分:0)

对于错误的数组索引,这个问题听起来很典型。

你的数组操作都假设第一个索引是1.但是默认情况下,如果你像这样重新调整数组:

ReDim DataReturns(NumberOfReturns, NumberOfStocks)

指数将从0开始。

尝试在模块的开头添加此行:

Option Base 1

这将所有未明确声明为Dim ar(x to y)的数组的第一个索引设置为基本索引1。