2015-10-24 3 views
0

J'ai la macro et la fonction suivantes qui fonctionnent, mais le résultat collé a une couche de zéros dans le côté gauche et le haut du résultat. J'espère que vous pouvez comprendre l'erreur dans mon code. Je suis à penser que l'erreur est dans la fonction:Fonction VBA créant une couche de 0 autour de la plage de sortie

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 

Et la fonction

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 

Répondre

0

Le problème semble typique de faux indices de tableau.

toutes vos opérations de tableau supposent que le premier indice est 1. Mais par défaut, si vous Redim un tableau comme celui-ci:

ReDim DataReturns(NumberOfReturns, NumberOfStocks) 

les indices commencera à 0.

Essayez d'ajouter cette ligne au début de votre module:

Option Base 1 

Ceci définit le premier index de tous les tableaux déclarés non explicitement Dim ar(x to y) à un indice de base 1.

+0

@Sebastian: Est-ce que cela vous a aidé? – Andre