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

Vba 运行时错误';9';:创建矩阵时下标超出范围,vba,matrix,runtime,subscript,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) R

我试图用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

您需要将这些行:

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
在这些行之后:

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

我试图在范围(C6:H15)内的每个单元格中运行值为1的以下代码:

我成功地运行了这段代码

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

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

希望这有帮助


维韦克

非常感谢你们两位的帮助。产生了另外两个问题:在进行更改并运行程序后,仍然显示相同的错误。然而,当我按下“end”而不是“debug”,然后再次运行程序时,它工作了。为什么按“结束”键可以让它工作?另外,为什么在带有双星号的零件上而不是在ReDim条目上出现错误,因为Excel不知道数组参数变量?@LukeDenham,很好,它对您有效。不知道为什么压端起作用。它可能已经清除了以前的运行状态(不确定,只是胡乱猜测)。@LukeDenham关于第二个问题,当在没有初始化的情况下调用ReDim时,VBA创建了计数器变量,并用0初始化它们。请注意,顶部没有定义显式选项。在VB/a代码中使用
Option Explicit
是一种很好的做法,它不允许程序在没有正确变量声明的情况下运行。请接受答案,以方便其他访客。@LukeDenham您可以单击每个答案投票图标下方的勾号。或者,访问并阅读“提问、获取答案、无干扰”部分。这应该给你一个想法。干杯