2013-03-31 113 views
0

我正在嘗試使用VBA創建varcov矩陣,但儘管試圖追蹤此問題的答案的小時數已無法解決。我的問題是,我不斷收到運行時錯誤「9」在每個以下雙帶星號線:運行時錯誤'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 

回答

0

我試圖在範圍內的每個單元中運行具有值1以下代碼(C6:H15):

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

+0

非常感謝你們的幫助。還產生了兩個額外的問題:進行更改並運行程序後,仍顯示相同的錯誤。但是,當我按'結束'而不是'調試',然後再次運行程序,它的工作。爲什麼按'結束'允許它工作?另外,爲什麼錯誤在雙星號而不是ReDim條目中出現中斷,而Excel的數組參數變量未知? –

+0

@LukeDenham,很好,它爲你工作。不知道爲什麼按結束工作。它可能已經清除了以前的運行狀態(不確定,只是瘋狂的猜測)。 –

+1

@LukeDenham爲你的第二個問題,當ReDim被調用時沒有初始化,VBA創建了計數器變量並用0初始化它們。注意,在頂部沒有定義Option Explicit。在VB/A代碼中使用'Option Explicit'是一種很好的做法,它不允許程序在沒有適當的變量聲明的情況下運行。請接受其他訪客輕鬆的答案。 –

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 
相關問題