[英]Aggregate function in VBA Excel
我有带有产品名称和批号的表。产品名称是从组合框 frmmaster.cmbproduct 中选择的。 每个产品都有一个唯一的批号组合,并且批号的最后一位会发生变化。 样品表
特定产品的下一个批号是最后一个批号+1。 我在 excel 中使用了聚合 function 来找到最高的批号。 但是相同的聚合 function 在 VBA 中抛出错误。
excel 的聚合 function 是 =AGGREGATE(14,4,($B$2:$B$2000 =N12)*$C$2:$C$2000,1) 在 N12 中我输入产品名称。 B 列包含产品名称,C 列包含批号
暗淡只要
Dim sh As Worksheet
Set sh = ThisWorkbook.Sheets("Database")
With sh
'On Error Resume Next
res = WorksheetFunction.Aggregate(14, 4, ("R2C2:R2000C2" = FrmMaster.CmbProduct.Value) * "R2C3:R2000C3", 1)
MsgBox (res)
End With
上面的代码抛出类型不匹配错误
我已将变量更改为将值保存为变量和字符串,但没有结果。
类型不匹配错误的原因是术语("R2C2:R2000C2" = FrmMaster.CmbProduct.Value) * "R2C3:R2000C3"
尝试将 boolean 值相乘(结果为("R2C2:R2000C2" = FrmMaster.CmbProduct.Value)
) 使用字符串文字"R2C3:R2000C3"
。 这当然是类型不匹配。
但还有其他问题。
术语"R2C2:R2000C2" = FrmMaster.CmbProduct.Value
将字符串"R2C2:R2000C2"
与FrmMaster.CmbProduct.Value
进行比较。 除了FrmMaster.CmbProduct.Value
为“R2C2:R2000C2”外,这总是false
的。 它与数组公式中的$B$2:$B$2000=N12
不同。 $B$2:$B$2000
是一系列单元格值,每个单元格值都与N12
的值进行比较。 但这不是VBA
能够做到的。 甚至(sh.Range("$B$2:$B$2000") = FrmMaster.CmbProduct.Value)
也无法工作,因为这会尝试将数组( sh.Range("$B$2:$B$2000")
)与单个数组进行比较价值。
因此,评估具有这种数组操作的数组公式的唯一方法是使用Evaluate
。 WorksheetFunction
在这里无能为力,因为它需要首先通过 VBA 评估单个VBA
参数。
解决您的问题的示例:
Dim res As Long
Dim sh As Worksheet
Dim range1Address As String
Dim range2Address As String
Dim arrayFormula As String
Set sh = ThisWorkbook.Sheets("Database")
With sh
range1Address = .Range("B2:B2000").Address(RowAbsolute:=True, ColumnAbsolute:=True, ReferenceStyle:=xlA1, External:=True)
range2Address = .Range("C2:C2000").Address(RowAbsolute:=True, ColumnAbsolute:=True, ReferenceStyle:=xlA1, External:=True)
arrayFormula = "AGGREGATE(14,4,(" & range1Address & "=""" & FrmMaster.CmbProduct.Value & """)*" & range2Address & ",1)"
res = Evaluate(arrayFormula)
MsgBox res
End With
从范围中获取range1Address
和range2Address
作为外部地址(包括工作簿名称和工作表名称)使其独立于活动工作表。
我想知道下面的公式是否对你有帮助。 它将返回它找到的与查找值 +1 关联的任何数字。
=IFERROR(LOOKUP(2,1/($A1:$A$1=A2),$B1:$B$1),0)+1
首先,功能。 function 查找 A2上方最后一次出现的 A2,其范围从绝对 $A$1 开始,以相对 $A1 结束。 后者将随着公式的向下复制而扩展。 B 列中的相同系统。如果未找到任何内容并发生错误,并且如果发生错误,则 function 返回 0。在此结果中添加 1。
现在,如果您将公式中的 0(这是没有先例的结果)替换为 2022050 之类的数字,则该公式将在示例的第一行以及随后出现的所有“阿莫西林”中返回正确的结果胶囊 500"。
它将在对乙酰氨基酚片剂线上返回 1,因为没有先例。 1 会突出显示,也许您有一个系统,您可以通过该系统在那里填写缺失的数字。
无论您是应用 VBA 还是工作表 function,问题都是一样的。 您需要一个种子编号来作为增量的基础。 综合考虑,工作表 function 看起来更容易实现。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.