【问题标题】:Aggregate function in VBA ExcelVBA Excel中的聚合函数
【发布时间】:2020-08-27 19:56:56
【问题描述】:

我有一个带有产品名称和批号的表格。产品名称是从组合框 frmmaster.cmbproduct 中选择的。 每个产品都有一个唯一的批号组合,并且批号的最后一位会发生变化。 示例表

特定产品的下一个批号是最后一个批号 +1。我在 excel 中使用聚合函数来查找最高的批号。但是相同的聚合函数在 VBA 中会引发错误。

Excel 的聚合函数是 =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

以上代码抛出类型不匹配错误

我已将变量更改为变量和字符串的值,但没有结果。

【问题讨论】:

  • 您必须用双引号将要评估的公式字符串中的组合值括起来.....res = Evaluate("=AGGREGATE(14,4,($B$2:$B$2000 =""" & FrmMaster.CmbProduct.Value & """)*$C$2:$C$2000,1)") :-)

标签: excel vba


【解决方案1】:

类型不匹配错误的原因是术语 ("R2C2:R2000C2" = FrmMaster.CmbProduct.Value) * "R2C3:R2000C3" 尝试将布尔值(("R2C2:R2000C2" = FrmMaster.CmbProduct.Value) 的结果)与字符串文字 "R2C3:R2000C3" 相乘。那当然是类型不匹配。

但还有其他问题。

术语"R2C2:R2000C2" = FrmMaster.CmbProduct.Value 将字符串"R2C2:R2000C2"FrmMaster.CmbProduct.Value 进行比较。这总是得到false,除了FrmMaster.CmbProduct.Value 将是“R2C2:R2000C2”。它与数组公式中的$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")) 与单个值进行比较。

因此,评估具有这种数组运算的数组公式的唯一方法是使用EvaluateWorksheetFunction 在这里无能为力,因为它需要首先通过 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 作为外部地址(包括工作簿名称和工作表名称),使其独立于活动工作表。

【讨论】:

  • 您在对Evaluate 的评论中以非常有用的方式解释了我的建议:+)
【解决方案2】:

我想知道下面的公式是否对你有帮助。它将返回它找到的与查找值 +1 相关联的任何数字。

=IFERROR(LOOKUP(2,1/($A1:$A$1=A2),$B1:$B$1),0)+1

首先,功能。该函数查找 A2 above A2 的最后一次出现,它在从绝对 $A$1 开始到相对 $A1 结束的范围内。后者将随着公式的向下复制而扩展。 B列中的相同系统。如果没有找到并且发生错误,并且如果发生错误,则该函数返回0。在此结果中添加1。

现在,如果您将公式中的 0(这是没有先例的结果)替换为 2022050 之类的数字,则该公式将在示例的第一行以及所有后续事件中返回正确的结果“阿莫西林胶囊500粒”。

它会在对乙酰氨基酚片剂线上返回 1,因为没有先例。 1 会突出显示,也许您有一个系统,您可以通过该系统在那里填写缺失的数字。

无论您是应用 VBA 还是工作表函数,问题都是一样的。您需要一个种子编号来作为增量的基础。综合考虑,工作表功能看起来更容易实现。

【讨论】:

    猜你喜欢
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多