首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >VBA Excel中的聚合函数

VBA Excel中的聚合函数
EN

Stack Overflow用户
提问于 2020-05-12 04:33:24
回答 2查看 1.4K关注 0票数 0

我有带产品名称和批号的桌子。产品名称是从组合框frmmaster.cmbproduct中选择的。对于批号和批号更改的最后一个数字,每个产品都有一个独特的组合。样本表

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

excel的聚合函数是=聚合(14,4,($B$2:$B$2000 = N12 )*$C$2:$C$2000,1),在N12中,我将产品名称放在其中。B列包含产品名称,C列包含批号

昏暗如久

代码语言:javascript
运行
复制
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

以上代码是抛出类型错配错误。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-12 07:22:40

类型不匹配错误的原因是术语("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计算出的单个函数参数。

解决问题的例子:

代码语言:javascript
运行
复制
 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
EN

Stack Overflow用户

发布于 2020-05-12 05:14:06

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

代码语言:javascript
运行
复制
=IFERROR(LOOKUP(2,1/($A1:$A$1=A2),$B1:$B$1),0)+1

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

现在,如果将公式中的0(在没有先例的情况下)中的0替换为类似于2022050的数字,则公式将在示例的第一行中返回正确的结果,并返回所有随后出现的“阿莫西林胶囊500”。

它将返回对乙酰氨基酚片线1,因为没有先例。1将突出,也许你有一个系统,你可以用它来填补那里缺失的数字。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61743884

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档