![](/img/trans.png)
[英]Calculate the difference between two non-adjacent columns, based on a “match column” using Excel VBA
[英]vlookup two difference data corresponding to two non-adjacent fields
数组公式²和由AGGREGATE¹函数产生的循环处理会产生计算滞后。 他们引用的范围应保持在最小行数。 在接收频繁添加和删除的数据上维持最少数量的相关行是很费时间的。
下面的公式看起来要复杂得多,但是它可以动态跟踪INDEX函数 数组中的确切行数。 为了简化公式,我允许多一行。 那是包含列标题标签的第1行。
在I10作为标准公式中,
=INDEX(B:B, AGGREGATE(15, 6, ROW($A$1:INDEX($A:$A, MATCH(1E+99,$A:$A )))/($A$1:INDEX($A:$A, MATCH(1E+99,$A:$A ))=$H10), ROW(1:1)))
向右和向下填充。
为您的字符串串联。 我从以前对类似问题的答案之一中摘录了该VBA用户定义功能³(又名UDF)。
Public Function conditional_concat_strs(rSTRs As Range, rCRITs As Range, rCRIT As Range, Optional sDELIM As String = ", ")
Dim c As Long, sTMP As String
Set rSTRs = Intersect(rSTRs, rSTRs.Parent.UsedRange)
Set rCRITs = Intersect(rCRITs, rCRITs.Parent.UsedRange)
Set rSTRs = rSTRs.Cells(1, 1).Resize(rCRITs.Rows.Count, rCRITs.Columns.Count)
For c = 1 To rCRITs.Cells.Count
If rCRITs(c).Value2 = rCRIT Then _
sTMP = sTMP & rSTRs(c).Value & sDELIM
Next c
conditional_concat_strs = Left(sTMP, Application.Max(Len(sTMP) - Len(sDELIM), 0))
End Function
在I2中,
=conditional_concat_strs(E:E,A:A, I1)
完整的列引用在Worksheet.UsedRange属性的范围内被截断。 使用它们没有计算上的损失。
¹ 数组公式需要使用Ctrl + Shift + Enter↵完成 。 正确输入第一个单元格后,就可以像填充其他公式一样向下或向右填充或复制它们。 尝试将全列引用减少到更接近代表实际数据范围的范围。 数组公式对数地缩短了计算周期,因此,最好将参考范围缩小到最小。 有关更多信息,请参见准则和数组公式示例 。
²AGGREGATE函数是Excel 2010引入的。在早期版本中不可用。
³ 将用户定义的功能(也称为UDF)放置在标准模块代码表中。 点击Alt + F11 ,当VBE打开时,立即使用下拉菜单插入►模块 ( Alt + I , M )。 将功能代码粘贴到新的模块代码表中,该代码表的标题类似于Book1-Module1(代码) 。 点击Alt + Q返回到您的工作表。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.