使用Excel VBA根据另外两列的值查找列匹配和合并

我在这里有一个小问题,虽然网站上有一些build议,但没有什么比我更适合这个法案了。 我需要根据行中某些单元格的值合并一些行。

我想我需要一些与名称匹配的代码,然后用同样的名字search一个“New Starter”条目。

以下是我的数据(Shift,name,detail)的外观:

 09:00-17:00史密斯约翰现在
 09:00-11:00 Smith John New Starter
 11:10-13:00 Smith John New Starter
 14:00-17:00 Smith John New Starter
 09:00-17:00 Connor Sarah礼物
 09:00-11:00 Connor Sarah新入门
 11:10-13:00 Connor Sarah新赛事
 14:00-17:00 Connor Sarah新赛事
 09:00-17:00克劳斯·圣诞老人礼物
 10:00-18:00鼠标Mickey存在
 10:00-11:00鼠标米奇新启动器
 11:10-13:00鼠标米奇新启动器
 14:00-18:00鼠标米奇新入门

我需要删除新的起始线(如果它们存在),而且用“新的起动器”replace它们的“现在”单元(如果需要,这可以是不同的文本):

 09:00-17:00 Smith John New Starter
 09:00-17:00 Connor Sarah新发起人
 09:00-17:00克劳斯·圣诞老人礼物
 10:00-18:00鼠标米奇新入门

你可以在这里看到,圣诞老人不是一个新的入门,因此保持为“现在”。

基本上,“新起跑线”是不需要的,但是我想给现在的工作人员提供不同的细节。

补充笔记:

  • 如果存在“新启动器”,则“存在”行将始终存在。 如果他们有“rest日”,就会有一个“rest日”线,我已经包含在其他子中提取。
  • 要保留的数据是“现在”行中的任何内容,只replace该标题(C列)。

以下代码应该符合您的条件。 testing工作。

Sub RemoveDups() Dim CurRow As Long, LastRow As Long, SrchRng As Range LastRow = Range("A" & Rows.Count).End(xlUp).Row Range("A1:C" & LastRow).Select Sheets(1).Sort.SortFields.Clear Sheets(1).Sort.SortFields.Add Key:=Range("B2:B" & LastRow) _ , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal Sheets(1).Sort.SortFields.Add Key:=Range("C2:C" & LastRow) _ , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With Sheets(1).Sort .SetRange Range("A1:C" & LastRow) .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With For CurRow = LastRow To 2 Step -1 If Range("C" & CurRow).Value = "Present" Then If CurRow <> 2 Then If Not Range("B2:B" & CurRow - 1).Find(Range("B" & CurRow).Value, LookIn:=xlValues, LookAt:=xlWhole) is Nothing Then Range("C" & CurRow).Value = "New Starter" End If End If ElseIf Range("C" & CurRow).Value = "New Starter" Then Range("C" & CurRow).EntireRow.Delete xlShiftUp End If Next CurRow End Sub 

第二种方法是让你考虑一下,在数据的位置上可能更“通用”和“便携”。 如果你想在整合之前对数据进行sorting,那么这个使用替代(更长期?)的Range.Sort方法兼容回到Excel 2003中。进一步的参数来细化这个方法可以在这里findmsdn的参考资料,这里

 Option Explicit Sub newStarters() Dim ws As Worksheet Dim dRng As Range Dim stRow As Long, endRow As Long, nameCol As Long, c As Long Dim nme As String, changeStr As String 'explicitly identify data sheet Set ws = Sheets("Data") 'start row of data stRow = 2 'column number of "Name" nameCol = 3 'set changeStr changeStr = "New Starter" 'Use the explicit data sheet With ws 'find last data row endRow = .Cells(Rows.Count, nameCol).End(xlUp).Row 'if you want the data to be sorted before consolidating '====================================================== 'Set dRng = .Range(.Cells(stRow, nameCol).Offset(0, -1), _ ' .Cells(endRow, nameCol).Offset(0, 1)) 'dRng.Sort Key1:=.Cells(stRow, nameCol), Order1:=xlAscending, _ ' Key2:=.Cells(stRow, nameCol).Offset(0, 1), Order2:=xlDescending, _ ' Header:=xlNo '====================================================== 'consolidate data For c = endRow To stRow Step -1 With .Cells(c, nameCol) nme = .Value If .Offset(0, 1).Value = changeStr Then If .Offset(-1, 0).Value = nme Then .Offset(-1, 1).Value = changeStr .EntireRow.Delete xlShiftUp End If End If End With Next c End With End Sub