Excel:比较两张不同工作表中的姓名

我有两个大约500行的Excel表。 工作表A具有名称列E),而工作表B具有用于小型和大型名称(H&I)的两个名称列。 我想创build一个循环,并通过比较这些列,并find匹配将匹配粘贴到新的工作表上。

进一步澄清:

在工作表B上,两个名称列类似于Cigna和Cigna Co,因此它们并不总是重复相同的名称,而在工作表A上,名称可能是Cigna,所以它们并不总是精确的。 但工作表A的名称必须匹配工作表B上的一个或两个名称。

像这样的事情是一个简单的循环和logging,然后看看第一张纸上的东西是否在第二张上。

不知道你的小名和大名是什么情况,所以我查了两栏

在你的VBA IDE进入工具菜单并select参考。 select“Microstoft ActiveX数据对象2.8库。这将用于logging集。

 Private Sub CommandButton1_Click() Dim rs As New ADODB.Recordset Dim ws As Excel.Worksheet Dim ws2 As Excel.Worksheet Dim lRow As Long Dim lRowOut As Long Set ws = ActiveWorkbook.Sheets("Sheet1") ws.Activate Set ws2 = ActiveWorkbook.Sheets("Sheet3") 'Add fields to your recordset for storing data. With rs .Fields.Append "Row", adInteger .Fields.Append "Name", adChar, 25 .Open End With 'Loop through and record the name lRow = 1 Do While lRow <= ws.UsedRange.Rows.count rs.AddNew rs.Fields("Row").Value = lRow rs.Fields("Name").Value = ws.Range("E" & lRow).Value rs.Update lRow = lRow + 1 ws.Range("A" & lRow).Activate Loop If rs.EOF = False Then rs.MoveFirst End If 'Switch to the second worksheet Set ws = Nothing Set ws = ActiveWorkbook.Sheets("Sheet2") ws.Activate 'Loop through and see if anything on this sheet was on the first sheet. lRow = 1 lRowOut = 1 Do While lRow <= ws.UsedRange.Rows.count 'Check if the column H name was recorded from the first sheet rs.Filter = "" rs.Filter = "Name='" & ws.Range("H" & lRow).Value & "'" If rs.RecordCount = 0 Then rs.Filter = "" rs.Filter = "Name='" & ws.Range("I" & lRow).Value & "'" If rs.RecordCount > 0 Then 'It has a date, delete the current row ws2.Range("A" & lRowOut).Value = rs.Fields("Name").Value lRowOut = lRowOut + 1 End If ElseIf rs.RecordCount > 0 Then 'It has a date, delete the current row ws2.Range("A" & lRowOut).Value = rs.Fields("Name").Value lRowOut = lRowOut + 1 End If lRow = lRow + 1 ws.Range("A" & lRow).Activate Loop End Sub 

如果你想在你的评论中看到名字的一部分,你可以使用一个。 将filter行更改为这样的东西。

 rs.Filter = "Name LIKE '%" & ws.Range("I" & lRow).Value & "%'" 

用公式来代替VBA,我会在新工作簿的A1中粘贴一个公式,如下所示。 假设您的“工作表A”位于Sheet1的Book1中,而“工作表B”中的H和I列是Sheet1上的Book2:

 =if(countif([Book2]Sheet1!H:I, [Book1]Sheet1!E1)>1, [Book1]Sheet1!A1, "") 

这就是说:“如果在Book2的Sheet1中的H和I列中最后有一个匹配Book1的Sheet1中的单元格E1的名称,则从Book1的Sheet1上的单元格E1中获取名称”

这将留下很多空白,但在这一点上,你可以过滤或整理出来。

如果要求比这更复杂,就像三列中的任何一个匹配一样,那么你可以添加多个CountIf()公式的结果并testing它们大于1,或者为每一列做一个单一的Countif() ,然后合并结果,sorting/筛选,Bob是你的叔叔。

如果这将是你经常做的事情,那么可能值得投资VBA路线,因为这将需要一些手工工作。