在子程序VBA中重新编写

时间:2012-09-11 17:45:27

标签: excel vba

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行停止,表示对象丢失。为什么是这样?感谢

1 个答案:

答案 0 :(得分: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编辑器的设置沙子点击工具>选项>声明可变的decleration>检查

这将确保您需要声明所有变量。

原样,上面的代码没有将Rng2声明为范围。因此,当Excel首次看到名称Rng2时,它会创建一个Variant类型变量,并将其设置为等于第一行中工作表的范围。 Excel注意到Sheets("20 Asset Model").Range("b3:f48")是一个单元格数组,它将变量Rng2视为一个数组类型变量,用于代码的其余部分。假设您要使用名为Rng2的变量作为范围,我们可以将其声明为此类并使用Set命令进行分配。

当你没有声明你的变量类型时,很容易混淆这样的事情。