首先,我不知道在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 我知道这一行负责将结果插入到指定的位置,但我无法在执行后看到它们。这有什么问题?
答案 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)