2014-12-30 1 views
2

여기에 약간의 수수께끼가 있습니다 & 사이트에 대한 제안이 있지만 나에게 맞는 것은 없습니다. 행의 일부 셀 값을 기반으로 일부 행을 병합해야합니다.Excel VBA를 사용하여 두 열의 값을 기반으로 열 합치기 및 합치기

나는 그 이름과 일치하는 일종의 코드가 필요하고 같은 이름을 가진 'New Starter'엔트리를 찾는다. 여기

은 얼마나 내 데이터 (시프트, 이름, 세부) 같습니다

 
09:00-17:00 Smith John  Present 
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 Present 
09:00-11:00 Connor Sarah New Starter 
11:10-13:00 Connor Sarah New Starter 
14:00-17:00 Connor Sarah New Starter 
09:00-17:00 Claus Santa  Present 
10:00-18:00 Mouse Mickey Present 
10:00-11:00 Mouse Mickey New Starter 
11:10-13:00 Mouse Mickey New Starter 
14:00-18:00 Mouse Mickey New Starter 

내가 (있는 경우) 새 스타터 줄을 제거뿐만 아니라 '새 스타터'로 자신의 '현재'셀을 교체해야 (필요한 경우이 다른 텍스트가 될 수 있지만) : 당신은 산타 새 스타터 & 아니라고 여기에서 볼 수 있습니다

 
09:00-17:00 Smith John  New Starter 
09:00-17:00 Connor Sarah New Starter 
09:00-17:00 Claus Santa  Present 
10:00-18:00 Mouse Mickey New Starter 

따라서 '현재'로 유지됩니다.

기본적으로 'New Starter'라인은 필요하지 않지만 새로운 스타터에게 현재 직원에게 다른 세부 사항을 제공하고자합니다.

추가 참고 :

  • 는 '새로운 스타터'가 존재하는 경우 A '현재'라인은 항상 존재합니다. 그들이 'Day Day Off'를 가지고 있다면, 이미 다른 Subs에서 추출한 'Day Off'라인이있을 것입니다.
  • 보존 할 데이터는 "현재"행에있는 것이므로 해당 제목 (C 열) 만 바꿉니다.
+2

어떤 코드에서 찾을 수 있습니다 구체화 지금까지 해봤 니? 이것은 가능하지만 Stack Overflow는 코드 아웃소싱 플랫폼이 아닙니다. 도움을 요청하기 전에 시도한 것과 공유 된 곳을 공유하십시오. ([Help for more info] (http://stackoverflow.com/help/on-topic)을 참조하십시오) – Chrismas007

+0

불행히도, 나는 실제 코드를 사용하지 않았습니다. 다른 곳에서 온라인으로 찾은 사례는 데이터를 단일 셀 (예 : 연결)에 병합하는 것에 대해 설명합니다. 다른 예제는 별도의 시트에서 데이터를 가져오고 하나의 시트로 결합하는 것을 가리 킵니다 ... 같은 것을 시작하지 않기 때문에 많은 양의 리엔지니어링을 할 가능성이 큽니다. 상황이 ... 분명히 유지하기 위해 데이터를 설명하지 않은 것에 대해 사과드립니다. 보관할 데이터는 "현재"행에있는 것이므로 제목 만 대체합니다 (C 열). – Russ

+0

포인터 Christmas007 주셔서 감사. 저는 약 3 일 동안이 프로젝트를 진행 해왔으니 이제는 괜찮은 분야에 집중할 것입니다. 몇 가지 예제 코드를 제공해야한다면 다시 살펴 보겠습니다. 나는 상사와 데드 라인이 있고 위와 같은 일을하지 않고 일할 수 있기 때문에 "Nice to haves"카테고리로 분류됩니다. 마감 시간에 도달하고 지금까지 작성한 내용에 만족하면 2 일 후에 개선 할 수 있습니다. – Russ

답변

2

다음 코드는 조건을 설명합니다. 시험 작동.

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 
+0

안녕하세요 Christmas007, 나를 위해이 시간을내어 주셔서 감사합니다. 현재 모든 '현재'항목을 'New Starter'로 변경하고 있지만 내일 내 이빨을 얻을 수있는 항목을 제공 할 것입니다. 나는 사물이 어떻게되는지를 알려주고 내가 발견 한 것을 나눠 주겠다. 다시 한번 감사드립니다. – Russ

+0

업데이트 된 코드로 수정되었습니다. 다시 시도해보고 작동하면 녹색 체크 표시를 클릭하여 대답을 수락하십시오. – Chrismas007

+0

다시 한 번 내 문제를 살펴 줘서 고마워. 나는 내 데이터에 'Present'와 'New Starter'이상을 가지고 있기 때문에 몇 가지 작은 조정을해야했습니다. 내 조정 내용을 표시하기 위해 위에 게시 한 내용을 편집해야합니까? – Russ

1

두 번째 방법은 데이터의 위치를 ​​고려하여 '일반'과 '휴대용'을 고려하는 것입니다. 당신이 통합하기 전에 데이터를 정렬하려면, 다음이 대체 사용 (더 오랜을?) Range.Sort 방법 호환 다시 Excel로 2003 또한 매개 변수를이 방법은 msdn reference, here

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 
+0

Christmas007의 코드는 저에게 효과적입니다. 그러나 좀 더 '일반적인'아이디어와 '휴대용'아이디어가 마음에 들었습니다. 프로젝트를 복제하고이 옵션을 살펴 보겠습니다. – Russ