使用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