比较 excel 中的两个列表并从第二个列表中提取缺少的值 - 不能重复(也超过两张纸)
Comparing two lists in excel and extracting values missing from 2nd list - cannot be duplicated (also over two sheets)
我正在编写工作项目报告,我正在尝试找到一种方法来比较两个项目代码列表,即“123456”,并查看第二个列表是否缺少任何本应输入的新值进入第一个列表。这些列表有数千条记录,到目前为止人们一直在手动执行(知道这一点让我很伤心)所以我试图让它自动化。
我尝试过使用带有 Index(Match(CountIF))) 公式的数组,但我似乎无法让它工作。
我的问题是,当我让数组填充我想要的东西时,我无法让它不重复值(我需要它来检查主列表,所以它不会在输出中输出超过一次的东西列表)。
我也试过使用其他公式 - 但列表可能有数千条记录,所以我无法为单元格匹配做一个单元格,因为列表会很大(那个或我的 excel 知识不足以了解简单的解决方案)。
如有任何帮助,我们将不胜感激。
- 数组可能不是最好的解决方案
- 我已经检查了很多其他解决方案,但它们并没有完全解决我的问题,我也没有适应它们的技能。
不确定您是否尝试设置它以便将来自动更新,但作为权宜之计:
列表 1 旁边的 Countif 列检查它们是否出现在列表 2 中...
...在 "row" 字段中输入一个仅显示 countif 值为 0 的数据透视表以删除重复项?
这是一种使用 VBA 和数组的方法,它比通过 sheet 更快。它检查 H 中的每个项目以查看它是否存在于 J 中(而不是相反)。我想这就是你想要的。
Sub x()
Dim v1, v2, v3(), i As Long, j As Long
v1 = Range("H2", Range("H" & Rows.Count).End(xlUp)).Value
v2 = Range("J2", Range("J" & Rows.Count).End(xlUp)).Value
ReDim v3(1 To UBound(v1, 1))
For i = LBound(v1) To UBound(v1)
If IsError(Application.Match(v1(i, 1), v2, 0)) Then
j = j + 1
v3(j) = v1(i, 1)
End If
Next i
Range("K2").Resize(j) = Application.Transpose(v3)
End Sub
使用输入框
Sub x()
Dim v1, v2, v3(), i As Long, j As Long
v1 = Application.InputBox("First list", Type:=8)
v2 = Application.InputBox("Second list", Type:=8)
ReDim v3(1 To UBound(v1, 1))
For i = LBound(v1) To UBound(v1)
If IsError(Application.Match(v1(i, 1), v2, 0)) Then
j = j + 1
v3(j) = v1(i, 1)
End If
Next i
Range("K2").Resize(j) = Application.Transpose(v3)
End Sub
一个公式解决方案。
请注意,我将前两个范围变成 Tables
并更改了名称。该公式正在使用结构化引用。如果您将来添加行,这将使公式自动更新。
=IFERROR(INDEX(ProjList1[#Data],AGGREGATE(15,6,1/ISNA(MATCH(ProjList1[#Data],ProjList2[#Data],0))*ROW(ProjList1[#Data]),ROWS(:1))-ROW(ProjList1[#Headers])),"")
它是如何工作的?简要地说:
MATCH
生成一个 #NA!
错误数组或一个数字。
ISNA
将其转换为 TRUE/FALSE
的数组,其中 TRUE
表示 table 1 中不在 table 2[=31 中的条目=]
- 将该数组乘以项目列表行的数组return错误消息数组与行号
AGGREGATE
小函数忽略错误returns给出行号的升序列表
INDEX
然后 returns 来自 Table 1 的适当条目
ROW(ProjList1[#Headers])
是一个更正,因此 table 可以位于工作表上的任何位置,并且仍然 return 是正确的行。
我正在编写工作项目报告,我正在尝试找到一种方法来比较两个项目代码列表,即“123456”,并查看第二个列表是否缺少任何本应输入的新值进入第一个列表。这些列表有数千条记录,到目前为止人们一直在手动执行(知道这一点让我很伤心)所以我试图让它自动化。
我尝试过使用带有 Index(Match(CountIF))) 公式的数组,但我似乎无法让它工作。
我的问题是,当我让数组填充我想要的东西时,我无法让它不重复值(我需要它来检查主列表,所以它不会在输出中输出超过一次的东西列表)。
我也试过使用其他公式 - 但列表可能有数千条记录,所以我无法为单元格匹配做一个单元格,因为列表会很大(那个或我的 excel 知识不足以了解简单的解决方案)。
如有任何帮助,我们将不胜感激。
- 数组可能不是最好的解决方案
- 我已经检查了很多其他解决方案,但它们并没有完全解决我的问题,我也没有适应它们的技能。
不确定您是否尝试设置它以便将来自动更新,但作为权宜之计:
列表 1 旁边的 Countif 列检查它们是否出现在列表 2 中... ...在 "row" 字段中输入一个仅显示 countif 值为 0 的数据透视表以删除重复项?
这是一种使用 VBA 和数组的方法,它比通过 sheet 更快。它检查 H 中的每个项目以查看它是否存在于 J 中(而不是相反)。我想这就是你想要的。
Sub x()
Dim v1, v2, v3(), i As Long, j As Long
v1 = Range("H2", Range("H" & Rows.Count).End(xlUp)).Value
v2 = Range("J2", Range("J" & Rows.Count).End(xlUp)).Value
ReDim v3(1 To UBound(v1, 1))
For i = LBound(v1) To UBound(v1)
If IsError(Application.Match(v1(i, 1), v2, 0)) Then
j = j + 1
v3(j) = v1(i, 1)
End If
Next i
Range("K2").Resize(j) = Application.Transpose(v3)
End Sub
使用输入框
Sub x()
Dim v1, v2, v3(), i As Long, j As Long
v1 = Application.InputBox("First list", Type:=8)
v2 = Application.InputBox("Second list", Type:=8)
ReDim v3(1 To UBound(v1, 1))
For i = LBound(v1) To UBound(v1)
If IsError(Application.Match(v1(i, 1), v2, 0)) Then
j = j + 1
v3(j) = v1(i, 1)
End If
Next i
Range("K2").Resize(j) = Application.Transpose(v3)
End Sub
一个公式解决方案。
请注意,我将前两个范围变成 Tables
并更改了名称。该公式正在使用结构化引用。如果您将来添加行,这将使公式自动更新。
=IFERROR(INDEX(ProjList1[#Data],AGGREGATE(15,6,1/ISNA(MATCH(ProjList1[#Data],ProjList2[#Data],0))*ROW(ProjList1[#Data]),ROWS(:1))-ROW(ProjList1[#Headers])),"")
它是如何工作的?简要地说:
MATCH
生成一个#NA!
错误数组或一个数字。ISNA
将其转换为TRUE/FALSE
的数组,其中TRUE
表示 table 1 中不在 table 2[=31 中的条目=]- 将该数组乘以项目列表行的数组return错误消息数组与行号
AGGREGATE
小函数忽略错误returns给出行号的升序列表INDEX
然后 returns 来自 Table 1 的适当条目
ROW(ProjList1[#Headers])
是一个更正,因此 table 可以位于工作表上的任何位置,并且仍然 return 是正确的行。