繁体   English   中英

在 VBA Excel 中聚合 function

[英]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

从范围中获取range1Addressrange2Address作为外部地址(包括工作簿名称和工作表名称)使其独立于活动工作表。

我想知道下面的公式是否对你有帮助。 它将返回它找到的与查找值 +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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM