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 型の変数が作成され、最初の行のシートの範囲と等しくなるように設定されます。ExcelSheets("20 Asset Model").Range("b3:f48")は がセルの配列であることを認識Rng2し、コードの残りの部分でバリアントを配列型変数として扱います。範囲として名前が付けられた変数を使用したいと仮定すると、Rng2それをそのように宣言し、Setコマンドを使用して割り当てることができます。

変数の型を宣言しないと、このような混乱が起こりやすくなります。

于 2012-09-11T17:53:55.673 に答える