使用宏获取Excel中列的最大值

时间:2011-12-19 17:38:37

标签: excel excel-vba vba

首先,我不知道在excel中编写宏,但现在我必须为朋友编写代码。所以我们走了。 在我的excel表中,我有一个表,它将一些生产者作为列,一年中有12个月作为行。在他们的交叉单元格中,它写出了生产者在那个月生产的产品数量。现在我需要在每个月内找到生产商品的最大值和最小值,并输出该商品的生产者。 我找到了类似问题的代码,但我不清楚它并且有错误。 这是代码:

Sub my()
Dim Rng As Range, Dn As Range, Mx As Double, Col As String
Set Rng = Range(Range("A1"), Range("A6").End(xlUp))
ReDim ray(1 To Rng.Count)

For Each Dn In Rng
Mx = Application.Max(Dn)
    Select Case Mx
        Case Is = Dn.Offset(, 0): Col = "A"
        Case Is = Dn.Offset(, 1): Col = "B"
        Case Is = Dn.Offset(, 2): Col = "C"
        Case Is = Dn.Offset(, 3): Col = "D"
    End Select
        ray(Dn.Row - 1) = Col
Next Dn

Sheets("Sheet2").Range("A2").Resize(Rng.Count) = Application.Transpose(ray)
End Sub

我收到以下错误: Run-time error'9': Subscript out of range. 所以我的问题是,这个错误意味着什么,我需要在这段代码中做些什么改变呢?

EDIT1 : 好的,现在错误消失了。但是我从哪里得到结果呢?

EDIT2 我知道这一行负责将结果插入到指定的位置,但我无法在执行后看到它们。这有什么问题?

3 个答案:

答案 0 :(得分:1)

错误意味着您尝试访问的阵列尚未定义为包含您正在寻找的序数:例如,阵列10的位置为0-9,因此如果我尝试访问数组(10),则会抛出该错误或者数组(-1)它会抛出该错误。

我不记得excel是基于0还是1的数组。

可能会改变

ray(Dn.Row - 1) = Col

if dn.row-1<> 0 then ' or set it to <0 if zero based.
 ray(Dn.Row - 1) = Col
end if

答案 1 :(得分:0)

您不需要VBA(宏)来执行此操作。可以使用工作表公式来完成。

E.g。

如果你的制作人是P1,P2,P3,P4,你的表格如下: -

      A        B    C    D    E    F
   +-------------------------------------------
1  |  Month    P1   P2   P3   P4   Top Producer
2  |  Jan      5    4    3    2    
3  |  Feb      2    3    5    1
4  |  Mar      6    4    4    3
...
...

放在细胞F2,F3,F4 ......中的以下公式将在每个月挑出最高生产者。

=INDEX($B$1:$E$1,MATCH(MAX(B2:E2),B2:E2,0))

通常最好尽可能尝试使用内置的Excel功能。只有在你真的需要的时候才能去VBA。即使您使用顶级生产者/月份数据进行其他只能在VBA中进行的操作,至少工作表会为您完成最高生产者/月份数据派生,这将简化整个过程所需的VBA

使用TRANSPOSE()函数,也可以使用工作表公式来转置范围。

顺便说一句 - 如果两个制作人的输出值相同,我不确定你想做什么。在您问题的VBA示例中,逻辑似乎是: - 如果两个生产者在一个月内联合起来,那么选择遇到的第一个生产者。我上面给出的公式应该复制这个逻辑。

答案 2 :(得分:0)

我已经非常广泛地使用这些功能,它们非常可靠和快速:

Public Function CountRows(ByRef r As Range) As Integer
    CountRows = r.Worksheet.Range(r, r.End(xlDown)).Rows.Count
End Function

Public Function CountColumns(ByRef r As Range) As Integer
    CountColumns = r.Worksheet.Range(r.End(xlToRight), r).Columns.Count
End Function

给它一个引用(例如"A2"),它将返回填充的单元格,或右边的单元格,直到找到空单元格。

要选择多个销售,我通常会执行类似

的操作
Set r = Range("A2")
N = CountRows(r)
Set r = r.Resize(N,1)