使用宏获取Excel中列的最大值
首先,我不知道如何在excel中编写宏,但现在我必须为一位朋友编写代码。我们开始吧。 在我的excel表格中,我有一个表格,其中以列的形式保存一些生产者,以行的形式保存一年中的12个月。在他们的交叉单元格中,写的是生产商当月生产的产品数量。现在我需要找到每个月生产的商品的最大值和最小值,并输出该商品的生产者。 我找到了一个类似问题的代码,但我不清楚它,它有错误。 代码如下:使用宏获取Excel中列的最大值,excel,vba,Excel,Vba,首先,我不知道如何在excel中编写宏,但现在我必须为一位朋友编写代码。我们开始吧。 在我的excel表格中,我有一个表格,其中以列的形式保存一些生产者,以行的形式保存一年中的12个月。在他们的交叉单元格中,写的是生产商当月生产的产品数量。现在我需要找到每个月生产的商品的最大值和最小值,并输出该商品的生产者。 我找到了一个类似问题的代码,但我不清楚它,它有错误。 代码如下: Sub my() Dim Rng As Range, Dn As Range, Mx As Double, Col As
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
我得到以下错误:
运行时错误'9':下标超出范围。
所以我的问题是,这个错误意味着什么,我需要在代码中修改什么才能工作
EDIT1:
好的,现在错误消失了。但是我从哪里得到结果呢
EDIT2
我知道此行负责将结果插入指定位置,但执行后我看不到它们。这有什么问题?错误意味着您尝试访问的数组没有定义为包含您要查找的序号:例如,数组10的位置为0-9,因此如果我尝试访问数组(10),它将抛出该错误或数组(-1),它将抛出该错误 我不记得excel是基于0还是基于1的数组 可能改变
ray(Dn.Row - 1) = Col
到
如果dn.row-1为0,则“然后”或将其设置为错误表示您尝试访问的数组未定义为包含您要查找的序号:例如,数组10的位置为0-9,因此如果我尝试访问数组(10),它将抛出该错误或数组(-1),它将抛出该错误
我不记得excel是基于0还是基于1的数组
可能改变
ray(Dn.Row - 1) = Col
到
如果dn.row-1为0,则“然后”或将其设置为,则不需要VBA(宏)来执行此操作。这可以使用工作表公式来完成
例如
如果您的生产商是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
也可以通过使用函数使用工作表公式来转换范围
顺便说一句,如果两个生产商的产值相同,我不确定你想做什么。在您问题中的VBA示例中,逻辑似乎是:-如果两个生产商在一个月内联合排名靠前,请选择遇到的第一个。我上面给出的公式应该复制这种逻辑。您不需要VBA(宏)来实现这一点。这可以使用工作表公式来完成
例如
如果您的生产商是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
也可以通过使用函数使用工作表公式来转换范围
顺便说一句,如果两个生产商的产值相同,我不确定你想做什么。在您问题中的VBA示例中,逻辑似乎是:-如果两个生产商在一个月内联合排名靠前,请选择遇到的第一个。我上面给出的公式应该复制这种逻辑。我已经广泛使用了这些函数,它们非常可靠和快速:
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)
我已经广泛使用了这些功能,它们非常可靠和快速:
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)
谢谢,错误消失了:)这一行呢:Sheets(“Sheet2”).Range(“A2”).Resize(Rng.Count)=Application.Transpose(ray)
?这是否意味着结果将写入excel文件的Sheet2中的一行?这意味着在(ray)上完成的转置将从Sheet2.A2开始放置。可能需要更多的时间才能完成;但它将从A2开始,然后根据对(ray)的转置(我认为是这样),但我看不到任何结果:(谢谢,错误消失了:)这一行呢:Sheets(“Sheet2”).Range(“A2”).Resize(Rng.Count)=Application.transpose(ray)
?这是否意味着结果将写入excel文件的Sheet2中的一行?这意味着在(ray)上完成的转置将从Sheet2.A2开始放置。可能需要更多的时间才能完成;但它将从A2开始,然后根据对(ray)的转置从A2开始,我想是的,但我看不到任何结果:(我知道这一点,但这不是我想要的。这是一项任务,或者说是一项家庭作业,需要用VBA完成。在这种情况下-a)我建议你的朋友尝试这个练习,如果你为他们做家庭作业,他们不会学到很多东西。b)除了VBA解决方案,提交一个更干净、更高效、基于公式的解决方案以获得额外分数如何?;-)a) 我想我的朋友不需要学这个:)b)不,不算额外分数。这必须用VBA来完成,因为这是他们的主题。我知道这一点,但它很重要