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 行,说对象丢失。为什么是这样?谢谢

4

1 回答 1

5

试试这个把你的范围设置为一个范围对象来声明它:(内嵌评论)

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命令来分配它。

当您不声明变量类型时,很容易发生这样的混淆。

于 2012-09-11T17:53:55.673 回答