运行时错误'9':创建矩阵时下标超出范围

时间:2013-03-31 06:44:47

标签: vba matrix runtime subscript

我正在尝试使用VBA创建一个varcov矩阵,但尽管数小时试图找到这个问题的答案已经无法解决它。我的问题是我在以下每个双星号行上都得到了运行时错误'9':

Sub varcovmmult()

    Dim returns()
    Dim trans()
    Dim Excess()
    Dim MMult()

    ReDim trans(ColCount, RowCount)
    ReDim Excess(RowCount, ColCount)
    ReDim MMult(ColCount, ColCount)
    ReDim returns(ColCount)

'Calculate mean, trans and excess arrays for dimensionalisation

'For mean:

    ColCount = Range("C6:H15").Columns.Count
    RowCount = Range("C6:H15").Rows.Count

    For j = 1 To ColCount
          **returns(j) = Application.Average(Range("C6:H15").Columns(j))
          Range("c30:h30").Cells(j) = returns(j)**
    Next j

'For excess:

    For j = 1 To ColCount
        For i = 1 To RowCount
            **Excess(i, j) = Range("c6:h15").Cells(i, j) - returns(j)
            Range("C36:H45").Cells(i, j) = Excess(i, j)**
        Next i
    Next j

'For tranpose:

    For j = 1 To ColCount
        For i = 1 To RowCount
            **trans(j, i) = Range("C36:H45").Cells(i, j)
            Range("C51:L56").Cells(j, i) = trans(j, i)**
        Next i
    Next j


'inject values into product array

    For i = 1 To ColCount
        For j = 1 To ColCount
            For k = 1 To RowCount
                **MMult(i, j) = MMult(i, j) + trans(i, k) * Excess(k, j)**
            Next k
        Next j
    Next i

'output product array values into varcov matrix and divide by n.years

    For i = 1 To ColCount
        For j = 1 To ColCount
            **Range("C62").Cells(i, j) = MMult(i, j)**
        Next j
    Next i

End Sub

2 个答案:

答案 0 :(得分:1)

你需要把这些行:

ReDim trans(ColCount, RowCount)
ReDim Excess(RowCount, ColCount)
ReDim MMult(ColCount, ColCount)
ReDim returns(ColCount)

在以下几行之后:

ColCount = Range("C6:H15").Columns.Count
RowCount = Range("C6:H15").Rows.Count

答案 1 :(得分:0)

我正在尝试在Range(C6:H15)的每个单元格中运行以下代码,值为1:

Sub varcovmmult()

    Dim returns()
    Dim trans()
    Dim Excess()
    Dim MMult()

    ColCount = Range("C6:H15").Columns.Count
    RowCount = Range("C6:H15").Rows.Count

    ReDim trans(ColCount, RowCount)
    ReDim Excess(RowCount, ColCount)
    ReDim MMult(ColCount, ColCount)
    ReDim returns(ColCount)

    For j = 1 To ColCount
        returns(j) = Application.Average(Range("C6:H15").Columns(j))
        Range("c30:h30").Cells(j) = returns(j)
    Next j

    For j = 1 To ColCount
        For i = 1 To RowCount
            Excess(i, j) = Range("c6:h15").Cells(i, j) - returns(j)
            Range("C36:H45").Cells(i, j) = Excess(i, j)
        Next i
    Next j

    For j = 1 To ColCount
        For i = 1 To RowCount
            trans(j, i) = Range("C36:H45").Cells(i, j)
            Range("C51:L56").Cells(j, i) = trans(j, i)
        Next i
    Next j

    For i = 1 To ColCount
        For j = 1 To ColCount
            For k = 1 To RowCount
                MMult(i, j) = MMult(i, j) + trans(i, k) * Excess(k, j)
            Next k
        Next j
    Next i

    For i = 1 To ColCount
        For j = 1 To ColCount
            Range("C62").Cells(i, j) = MMult(i, j)
        Next j
    Next i

End Sub

我已成功运行此代码。

如果此范围内的任何单元格中的值为空或非数字,则会收到一个错误类型不匹配。

如果您的下标超出范围,那么您可以尝试使用ColCount - 1或RowCount - 1.只需检查Cell(i,j)中是否存在适当的值。

希望这有帮助!

的Vivek