2012-09-11 32 views
0
Sub testCov() 
    Rng2 = Sheets("20 Asset Model").Range("b3:f48") 
    Dim covMatrix() As Variant 
    ReDim covMatrix(1 To Rng2.Columns.Count, 1 To Rng2.Columns.Count) 
    Call constructCovMatrix(Rng2, covMatrix) 
    MsgBox (covMatrix) 
End Sub 

Sub constructCovMatrix(rng, ByRef covMatrix) 
    '@rng The Range of the return series. 

    Dim i As Integer 
    Dim j As Integer 
    For i = 1 To rng.Columns.Count 
     For j = 1 To rng.Columns.Count 
      covMatrix(i, j) = Application.WorksheetFunction.Covar(rng.Columns(i), rng.Columns(j)) 
     Next 
    Next 
End Sub 

代碼停在ReDim行,表示缺少對象。爲什麼是這樣?由於子程序VBA中的ReDim

+2

'Rng2 =表(「20資產模型」)。範圍(「b3:f48」)'是一個數組而不是範圍。嘗試設置Rng2 =表格(「20資產模型」)。範圍(「b3:f48」)'。 – user3357963

回答

4

試試這個設置你的範圍作爲對象是它聲明:(在線評論)

Sub testCov() 

    Dim Rng2 As Range '- Declare variable 
    Set Rng2 = Sheets("20 Asset Model").Range("b3:f48") '-Set range 
    Dim covMatrix() As Variant 
    ReDim covMatrix(1 To Rng2.Columns.Count, 1 To Rng2.Columns.Count) 
    Call constructCovMatrix(Rng2, covMatrix) 
    MsgBox (covMatrix) 

    Set Rng2 = Nothing '- Cleanup anytime 'Set' is used 
End Sub 

注:

您可能要到VBA編輯器的設置沙點擊工具>選項>聲明變量刪除>選中

這將確保您需要聲明所有變量。

就這樣,上面的代碼並未聲明Rng2作爲範圍。因此,當Excel第一次看到名稱Rng2時,它會創建一個Variant類型變量並將其設置爲等於第一行中的工作表範圍。 Excel注意到Sheets("20 Asset Model").Range("b3:f48")是一個單元格數組,它將變體Rng2作爲數組類型變量向前推進,用於其餘代碼。假設您想要使用名爲Rng2的變量作爲範圍,我們可以聲明它,並使用Set命令來分配它。

當你沒有聲明你的變量類型時,很容易發生這種混淆。

+2

'你可能想要進入VBA編輯器的設置sand click工具> options> Declare varible decleration> checked' <---我會說,因爲你有這樣的問題,你應該總是使用這個設置。 – enderland