2015-07-02 35 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

没关系。我刚刚看到评论的“双重”部分。使用双重作品。 –