2015-07-02 33 views
0

我想寫一個宏,它返回基於另一列中的值的列的最大值。我認爲我的代碼正在工作,但它只返回一個零值。我試圖做一個大約2500行的表格。我創建了一個較小的表來試圖找出問題所在,但我得到了相同的結果(它返回0而不是10)。VBA的最大數組返回值爲0

這裏是我的代碼:

Sub test() 

    imax = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row 

    Dim MaxArray(2 To 11) As String 

    For t = 2 To 11 

     If (Cells(t, 1) = 1) Then MaxArray(t) = Cells(t, 2).Value 

    Next t 

    Cells(2, 3).Value = WorksheetFunction.max(MaxArray) 

End Sub 

這裏的結果我得到:

Column 1 Column 2 Max of Column 1 

    1   4    0 
    1   6 
    1   3 
    1   10 
    1   9 
    2   5 
    2   2 
    2   3 
    2   8 

誰能告訴我是什麼問題?

一些注意事項:我知道如何在Excel中使用數據透視表或公式來做到這一點,但我真的希望它能夠在運行前後運行一堆其他東西的宏中進行。我只想按下按鈕一次而不是停止,並且必須添加一個表格或公式,然後再按下另一個按鈕才能繼續。

+0

是否嘗試將'Dim MaxArray(2至11)As String'更改爲'Dim MaxArray(2至11)As Integer'。不知道,但也許這是問題 –

+0

這是問題所在。謝謝! –

回答

0

嘗試:

Cells(2, 3).Value = Evaluate("=MAX(B2:B11))") 

也許也改變了數組類型設置爲數字DoubleInteger可能的幫助。

而且順便說一句,我認爲這也將降低您的循環:

Set MaxArray = Range(Cells(2, 2), Cells(11,2)) 
+0

謝謝你們兩位!整數調用是問題。至於設置減少循環的函數,我認爲我不能正確使用它,因爲我得到一個編譯錯誤,說「不能分配給數組」。 –

+0

不客氣。請標記爲答案。至於數組可能範圍設置不正確太寬或太窄 –

0

我與整數建議固定,但後來我意識到,我的實際數字四捨五入爲兩位或三位小數。我試圖通過使用Long來代替Integer,但它仍然只是返回一個整數。我如何得到它包含小數位?

代碼:

Sub test2() 

imax = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row 

Dim MaxArray(2 To 11) As Long 

For t = 2 To 11 

    If (Cells(t, 1) = 1) Then MaxArray(t) = Cells(t, 2).Value 

Next t 

Cells(2, 3).Value = WorksheetFunction.max(MaxArray) 

End Sub 

數據表:

第1欄第2最大1的

1   4.66  10 
1   6.2 
1   3.987 
1   10.125 
1   9.1 
2   5.3 
2   2.21 
2   3.654 
2   8.12 
2   20.56 

感謝您的幫助!

+0

沒關係。我剛剛看到評論的「雙重」部分。使用雙重作品。 –