我有 5 个不同活动的参加者名单。我需要找到参加过这 5 个活动的人。
我使用了一种解决方法,即一次使用两列来比较电子邮件地址,=IF(ISERROR(MATCH(D3,$N$3:$N$124,0)),"",C3)
但我想一次性完成。
或者也许解决方法比创建一劳永逸的解决方案更省力!
答案1
只要五个与会者列表位于简单的单元格区域内(例如,如果它们都在各自的列中),使用COUNTIF
封闭范围内的一系列函数AND
应该适用于所有版本(可追溯到 Excel 2000):
为了方便使用,单元格 B5 的公式如下所示:
=AND(COUNTIF($E:$E,$A5)>0,COUNTIF($F:$F,$A5)>0,COUNTIF($G:$G,$A5)>0,COUNTIF($H:$H,$A5)>0,COUNTIF($I:$I,$A5)>0)
虽然对于搜索大量或可变数量的列来说,构建这个方法会相当麻烦,但对于五个数据集来说还不错。只要您的列表采用易于通过上述公式引用的格式,它应该对您来说就很好。
COUNTIFS
(需要注意的是,如果需要的话,使用现代函数可能有更优雅的方法来做到这一点。)
答案2
如果将数据保存为CSV,并导入到Access中。
选择不同的“电子邮件地址”,计数(“电子邮件地址”)作为 x 从“地址”组中按“电子邮件地址”分组
然后第二列标有X为 5,因为电子邮件地址出现了 5 次,因此它们属于全部 5 个类别。
答案3
我思考我有一个更好的方法。我说思考因为如果您有大量数据或数据分布在多个工作表(甚至工作簿)中,这种方法会更好。这也是一种很好的方法,因为当尝试查找匹配数据(或视情况而定,不匹配数据)时,下面的宏可以用于许多其他目的。
总之,这个宏允许您在同一工作表或跨工作表的两个范围之间查找匹配的数据。我已将宏代码粘贴在此答案的底部。我假设您在此阶段知道如何使用它。我还假设您使用的是在 Windows 中运行的 Excel 版本。
宏观步骤总结
- 运行宏时,它会要求您选择包含所需数据的单元格范围。例如,假设您的第一个工作表中的 C 列中包含从 C2 到 C101 的所有电子邮件地址,则您将选择该范围。
- 然后宏会要求您选择要调查的范围。只需选择包含第二个事件的电子邮件地址的范围即可。
- 然后,宏将提示您指定一个“注释”,以便宏用来指示它已找到匹配项。您可以在此处指定任何内容,例如“找到”、“是”等。
- 最后,宏会要求您输入一个列字母。这是宏将您在上一步中输入的“注释”放入的列。
例如
假设您的工作簿中有五张相同的工作表,每张工作表对应一份出席名单。假设每张工作表中都填充了 A 至 F 列,而 C 列包含电子邮件地址。我们还假设您有 100 名出席者,因此电子邮件地址出现在每张工作表中的 C2 至 C101 之间。
运行宏。
在步骤1在第一个工作表中选择区域 C2:C101。第2步选择区域 C2:C101第二工作表。在步骤3输入“是”作为您的评论。对于步骤4输入字母 G(只是因为它是根据我的例子第一个空列,但在您的情况下它很可能是另一个列字母)。
当宏运行时,第一个工作表的 G 列中,在第二个与会者列表中找到电子邮件地址的任何行中都会显示文本“是”。
现在,对于您的情况,您需要再次运行宏。按照上述步骤操作,但这次在第 2 步中选择第三个工作表中的范围 C2:C101,在第 4 步中选择您之前选择的列之后的下一列。在我的场景中,它现在是 H 列。
当宏运行时,第一个工作表的 H 列中,在第三个与会者列表中找到电子邮件地址的任何行中都会显示文本“是”。
现在您将开始看到发生了什么。当您重复这些步骤以覆盖所有出席者名单时,您将有四列在相关位置包含文本“是”。现在您可以对数据进行排序/过滤,以便仅显示所有这些列中包含“是”的行。这些是参加过所有活动的人。
最后,在使用任何宏之前,请备份您的 Excel 文件,以便获得一份干净的副本!
Sub FindMatchingData()
'This macro and Excel Add-In was designed by Monomeeth to allow users an easy
'way to find matching data between two ranges, either within the same worksheet or
'across worksheets within the same workbook.
Dim MySearchRange As Range
Dim c As Range
Dim findC As Variant
Set MyRange = Application.InputBox( _
Prompt:="Select the range of cells containing the data you are looking for:", Type:=8)
Set MySearchRange = Application.InputBox( _
Prompt:="Select the range you wish to investigate:", Type:=8)
Response = InputBox(Prompt:="Specify the comment you wish to appear to indicate the data was found:")
MyOutputColumn = Application.InputBox( _
Prompt:="Enter the alphabetical column letter(s) to specify the column you want the message to appear in.")
Set Sht = MyRange.Parent
For Each c In MyRange
If Not c Is Nothing Then
Set findC = MySearchRange.Find(c.Value, LookIn:=xlValues)
If Not findC Is Nothing Then
Sht.Range(MyOutputColumn & c.Row).Cells.Value = Response
End If
End If
Next
Excel.Application.SendKeys Keys:="^{HOME}", Wait:=True
DoEvents
MsgBox "Investigation completed."
End Sub