【问题标题】:ReDim in Subroutine VBA子程序 VBA 中的 ReDim
【发布时间】:2012-09-04 16:52:25
【问题描述】:
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 行,说对象丢失。为什么是这样?谢谢

【问题讨论】:

  • Rng2 = Sheets("20 Asset Model").Range("b3:f48") 是一个数组而不是一个范围。试试Set Rng2 = Sheets("20 Asset Model").Range("b3:f48")

标签: excel vba


【解决方案1】:

尝试将您的范围设置为声明它的范围对象:(cmets in-line)

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 命令对其进行赋值。

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

【讨论】:

  • You may want to go to the VBA editor's setting sand click tools > options > Declare varible decleration > checked
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-25
  • 1970-01-01
  • 2020-06-06
  • 1970-01-01
  • 2021-05-07
相关资源
最近更新 更多