【发布时间】:2021-07-01 22:00:50
【问题描述】:
有几个问题会问类似但不确切的问题。
我有两列 X 和 Y。 Y 仅包含存在于 X 中的值。我想创建一个列Z,其中包含仅存在于X 中的所有值。
-
X和Y可以包含重复数据,如示例所示 -
X存在于sheet1而Y and Z存在于sheet2
| X | Y | Z |
|---|---|---|
| a | c | a |
| b | e | b |
| b | d | |
| c | e | |
| d | ||
| e |
到目前为止,我录制了一个宏,因此代码非常慢,尽管我尽了最大努力清理它。我不会发布整个代码,因为它很乱,但基本上我已经
-
使用
unique()函数创建了两列,分别包含X和Y的唯一值。 -
使用
vlookup()创建与我刚刚创建的两个相邻的列,返回一个空字符串 如果相邻的唯一X值存在于唯一的Y列中,则返回X值。这部分速度非常慢。我在一个单元格中创建了公式,然后将其粘贴下来。
Range("U2").Formula2R1C1 = "=UNIQUE('1.HoldingCart'!C[-18])"
Range("V2").Formula2R1C1 = "=UNIQUE(C[-19])"
Range("W3").FormulaR1C1 = "=IF(ISNA(VLOOKUP(RC[-2], C[-1], 1, FALSE)), RC[-2], """")"
Range("W3").Copy
Range("W3:W" & Cells(Rows.Count, "U").End(xlUp).Row).PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
- 过滤掉
vlookup()列上的所有空字符串。复制了实际值。摆脱了过滤器。删除所有内容,然后粘贴复制的数据,从而创建列Z。
' Get the discrepancies
ActiveSheet.Range("$W:$W").AutoFilter Field:=1, Criteria1:="<>"
Range("W2:W" & Cells(Rows.Count, "W").End(xlUp).Row).Copy
Range("X2").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _:=False, Transpose:=False
' Clean the sheet
ActiveSheet.ShowAllData
Selection.AutoFilter
Range("U2:W" & Cells(Rows.Count, "W").End(xlUp).Row).ClearContents
' Paste the discrepancies
Range("X2:X" & Cells(Rows.Count, "X").End(xlUp).Row).Cut
Range("U2").Select
ActiveSheet.Paste
抱歉,您只需要阅读那段可怕的代码。我很高兴把这一切都扔掉。任何帮助将不胜感激。
【问题讨论】:
-
供您参考,如果您要使用公式,您可以简单地使用
=UNIQUE(FILTER(A1:A6,COUNTIF(B1:B4,A1:A6)=0)) -
我不能确定 A 列和 B 列的大小,我也不想要标题。所以我可以不使用
A1:A6和B1:B4来代替A2: A End和B2:B End吗? -
是的,当然,您希望找到这些列中最后使用的行。
-
要查找列中最后使用的行,可以使用如下代码: fRow = worksheet.Cells(worksheet.Rows.Count, 1).End(xlUp).Row 这将得到列 1/A 的最后一行,并将结果存储到 fRow。尝试在您的代码中使用它.. :)
-
你的意思是没有VBA?如果是这样,不妨试试:
=UNIQUE(FILTER(A2:INDEX(A:A,MATCH("ZZZ",A:A)),COUNTIF(B2:INDEX(B:B,MATCH("ZZZ",B:B)),A2:INDEX(A:A,MATCH("ZZZ",A:A)))=0))
标签: excel vba excel-formula office365