例如,我有一个xls,其中:
我需要以下内容:
使用SQL或Python在元素列表上设置操作似乎很容易。但是如何在xls中做到这一点?
注意:它应该是具有最少复制粘贴和点击的自动化。例如,我不想在B下面复制粘贴A,然后“删除重复”以获得A联合B.
答案 0 :(得分:1)
好吧,Microsoft Excel不处理内置的集合操作。但您可以使用 MATCH 功能和错误处理来模拟VBA。
以下是适用于我的代码(我假设您已经在第一行开头):
Sub set_operations()
Dim i, j, rangeA, rangeB, rowC, rowD, rowE, rowF As Long
Dim test1, test2 As Boolean
rangeA = ActiveSheet.Range("A" & CStr(ActiveSheet.Rows.Count)).End(xlUp).Row()
rangeB = ActiveSheet.Range("B" & CStr(ActiveSheet.Rows.Count)).End(xlUp).Row()
rowC = 2
rowD = 2
rowE = 2
rowF = 2
test1 = False
test2 = False
test2 = False
'A union B
On Error GoTo errHandler1
For i = 2 To rangeA
If Application.Match(ActiveSheet.Cells(i, 1), ActiveSheet.Range("C:C"), 0) > 0 Then
If test1 = True Then
ActiveSheet.Cells(rowC, 3) = ActiveSheet.Cells(i, 1)
rowC = rowC + 1
End If
End If
test1 = False
Next i
For j = 2 To rangeB
If Application.Match(ActiveSheet.Cells(j, 2), ActiveSheet.Range("C:C"), 0) > 0 Then
If test1 = True Then
ActiveSheet.Cells(rowC, 3) = ActiveSheet.Cells(j, 2)
rowC = rowC + 1
End If
End If
test1 = False
Next j
'A intersection B
For i = 2 To rangeA
On Error GoTo errHandler2
If Application.Match(ActiveSheet.Cells(i, 1), ActiveSheet.Range("B:B"), 0) > 0 Then
On Error GoTo errHandler1
If Application.Match(ActiveSheet.Cells(i, 1), ActiveSheet.Range("D:D"), 0) > 0 Then
If test1 = True And test2 = False Then
ActiveSheet.Cells(rowD, 4) = ActiveSheet.Cells(i, 1)
rowD = rowD + 1
End If
End If
End If
test1 = False
test2 = False
Next i
'A minus B
For i = 2 To rangeA
On Error GoTo errHandler2
If Application.Match(ActiveSheet.Cells(i, 1), ActiveSheet.Range("B:B"), 0) > 0 Then
On Error GoTo errHandler1
If Application.Match(ActiveSheet.Cells(i, 1), ActiveSheet.Range("E:E"), 0) > 0 Then
If test1 = True And test2 = True Then
ActiveSheet.Cells(rowE, 5) = ActiveSheet.Cells(i, 1)
rowE = rowE + 1
End If
End If
End If
test1 = False
test2 = False
Next i
'B minus A
For i = 2 To rangeB
On Error GoTo errHandler2
If Application.Match(ActiveSheet.Cells(i, 2), ActiveSheet.Range("A:A"), 0) > 0 Then
On Error GoTo errHandler1
If Application.Match(ActiveSheet.Cells(i, 2), ActiveSheet.Range("F:F"), 0) > 0 Then
If test1 = True And test2 = True Then
ActiveSheet.Cells(rowF, 6) = ActiveSheet.Cells(i, 2)
rowF = rowF + 1
End If
End If
End If
test1 = False
test2 = False
Next i
errHandler1:
test1 = True
Resume Next
errHandler2:
test2 = True
Resume Next
End Sub
答案 1 :(得分:1)
交叉点(在A和B中):=IFNA(VLOOKUP(B2,$A$2:$B$42,1,FALSE),"")
联盟(在A或B中):=IFS(A2,A2,B2,B2)
请注意,IFS
仅是最新版本(截至2018年)。
A-B(仅在A中):=IF(NOT(IFNA(MATCH(A2,$B$2:$B$42,0),FALSE)),IF(A2,A2,""),"")
B-A(仅在B中):=IF(NOT(IFNA(MATCH(B2,$A$2:$A$42,0),FALSE)),IF(B2,B2,""),"")
(交换字母)
答案 2 :(得分:1)
Excel 似乎无法完成这项工作。但是,有可用的加载项。您可能想要测试免费和开源的 Power Analytics for Excel。它带有一些完全执行您要求的功能:
在 Excel 365 中的使用
在 Excel 365 Power Analytics for Excel 中允许使用动态数组。此功能仅包含在 Excel 365 中,在 Excel 2019、2016 等中不可用。
在以下示例中,我们只需将 =PA_Sets_And(A2:A11;B2:B6) 写入单个单元格 D2,然后 - 就像魔术一样 - 公式扩展到所需的三行长度。
在 Excel 2019、2016 中的使用,...
这里我们使用 PA_Sets_And 方法来查找单元格 (B2) 是否包含在整个集合 (A2:A11) 的范围内。不像 Excel 365 那样酷,但比 VLOOKUP 好一点 :-)
答案 3 :(得分:0)
您可以简单地使用以下公式获得结果
= IF(LOWER(A4)= LOWER(B4),“”,A4)
答案 4 :(得分:0)
我在几个方面感到惊讶:
(1)2020年现在.....在Excel中仍然没有设置功能
(2)投票率最高的答案(自2018年起)是非常不切实际的:在现实生活中,数据集并非整齐地插入空行,其中空值与另一个数据集不符;这是解决方案的前提。
最实用的解决方案(尽管仍然很尴尬; Microsoft吗?您听到了吗?)是借助数据透视表的解决方法: >
结果是一种“单次热编码”数据透视表,具有:
通过第2列(也称为“集合A”),3(又称为“集合B”)和第4列(又称为“集合A AND集合B”)中的值,可以轻松地在不同的集合和交集上过滤生成的数据透视表)。