ReDim在子程序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行,说对象丢失。 为什么是这样? 谢谢
尝试这个设置你的范围作为一个范围对象声明:(内嵌评论)
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编辑器的设置sand click工具> options> Declare varible decleration>选中
这将确保您需要声明所有variables。
就像上面的代码没有声明Rng2
是一个范围。 因此,当Excel第一次看到名称Rng2
它会创build一个Varianttypesvariables,并将其设置为等于第一行中的表格范围。 Excel注意到Sheets("20 Asset Model").Range("b3:f48")
是一个单元格的数组,它把变体Rng2
作为一个数组typesvariables,用于其余的代码。 假设你想使用名为Rng2
的variables作为范围,我们可以声明它,并使用Set
命令来分配它。
当你没有声明你的variablestypes时,就很容易发生混淆。