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

首先,我不知道如何在excel中编写macros,但现在我必须为朋友编写代码。 所以我们走了 在我的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. 所以我的问题是,这个错误是什么意思,我需要改变这个代码工作?

编辑1 :好的,现在错误消失了。 但是,我在哪里得到的结果?

编辑2我知道这行是负责插入结果在指定的地方,但我不能看到他们执行后。 那有什么问题?

错误意味着你试图访问的数组没有被定义为包含你正在寻找的序数:例如数组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 

你不需要VBA(一个macros)来做到这一点。 可以使用工作表公式完成。

例如

如果你的生产者是P1,P2,P3,P4,你的工作表是这样的:

  ABCDEF +------------------------------------------- 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)) 

通常最好在可能的情况下尝试使用内置的Excelfunction。 只有在真正需要的情况下才能使用VBA。 即使您将顶级生产者/月份数据用于其他一些只能在VBA中执行的操作,至less顶级生产者/月份数据派生是由工作表完成的,这将简化整个stream程所需的VBA 。

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

顺便说一句 – 我不确定你想要做什么,如果两个生产者有相同的产出价值。 在你的问题的VBA例子中,逻辑似乎是: – 如果两个生产者在一个月内联合最高,挑选遇到的第一个。 我上面给出的公式应该复制这个逻辑。

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

 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" ),它将返回已填充的单元格,或者直到find空单元格。

要select多个销售,我通常会做类似的事情

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