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时,就很容易发生混淆。