반응형
블로그 이미지
개발자로서 현장에서 일하면서 새로 접하는 기술들이나 알게된 정보 등을 정리하기 위한 블로그입니다. 운 좋게 미국에서 큰 회사들의 프로젝트에서 컬설턴트로 일하고 있어서 새로운 기술들을 접할 기회가 많이 있습니다. 미국의 IT 프로젝트에서 사용되는 툴들에 대해 많은 분들과 정보를 공유하고 싶습니다.
솔웅

최근에 받은 트랙백

글 보관함


오늘 동료가 두개의 sheet에 있는 데이터를 비교하는 엑셀 프로그래밍을 문의했는데요.

구글링 해 보니까 아주 좋은 소스를 누가 올려 놨네요.


한번 분석해 봐야겠어요.


Public Sub ReconReport() 
    Dim rngCell As Range 
     
    For Each rngCell In Worksheets("Sheet1").UsedRange 
        If Not rngCell = Worksheets("Sheet2").Cells(rngCell.Row, rngCell.Column) Then _ 
        Let Worksheets("Sheet3").Cells(rngCell.Row, rngCell.Column) = rngCell 
    Next 
End Sub 


처음에 rngCell 이라는 Range 를 정의했습니다.


그리고 For문을 돌리는데요.


Sheet1 이라는 worksheet의 사용된 각 cell들 만큼 루프를 돕니다.

이거 아주 유용한 라인이네요.


UsedRange Property 는 아주 유용하게 이용될 수 있을 것 같습니다.


Worksheets("Sheet1").Activate
ActiveSheet.UsedRange.Select


이렇게 하면 Sheet1 중에 데이터가 있는 셀은 모두 선택이 되겠죠.


데이터가 있는 셀 중에 첫번째 row와 맨 마지막 row를 구하려면 아래와 같이 하면 됩니다.


FirstRow = ActiveSheet.UsedRange.Rows(1).Row 
LastRow = ActiveSheet.UsedRange.Rows(ActiveSheet.UsedRange.Rows.Count).Row 
 'or
LastRow = ActiveSheet.UsedRange.Rows(UBound(ActiveSheet.UsedRange.Value)).Row 


특정 Field의 마지막 row를 구할 땐 End(xlUp).Row 를 사용할 수도 있습니다.


Sub PickedActualUsedRange()
  Range("A1").Resize(Cells.Find(What:="*", SearchOrder:=xlRows, _
      SearchDirection:=xlPrevious, LookIn:=xlValues).Row, _
      Cells.Find(What:="*", SearchOrder:=xlByColumns, _
      SearchDirection:=xlPrevious, LookIn:=xlValues).Column).Select
End Sub


Sub SelectActualUsedRange()
  Dim FirstCell As Range, LastCell As Range
  Set LastCell = Cells(Cells.Find(What:="*", SearchOrder:=xlRows, _
      SearchDirection:=xlPrevious, LookIn:=xlValues).Row, _
      Cells.Find(What:="*", SearchOrder:=xlByColumns, _
      SearchDirection:=xlPrevious, LookIn:=xlValues).Column)
  Set FirstCell = Cells(Cells.Find(What:="*", After:=LastCell, SearchOrder:=xlRows, _
      SearchDirection:=xlNext, LookIn:=xlValues).Row, _
      Cells.Find(What:="*", After:=LastCell, SearchOrder:=xlByColumns, _
      SearchDirection:=xlNext, LookIn:=xlValues).Column)
  Range(FirstCell, LastCell).Select
End Sub

Sub GetLastRowWithData() Dim LastRow As Long LastRow = Cells.Find(What:="*", SearchOrder:=xlRows, _ SearchDirection:=xlPrevious, LookIn:=xlValues).Row MsgBox LastRow End Sub

구글링 하다 보니까 다양한 예제들이 나오네요.

나중에 좀 분석해 봐야 겠습니다.


다시 원래 보던 예제를 볼까요.

For 문 안에 보면 if 문이 나옵니다.


이 if문을 번역해 보죠.

If Not rngCell = Worksheets("Sheet2").Cells(rngCell.Row, rngCell.Column) Then

Sheet1의 각 Cell 이 같은 위치의 Sheet2의 Cell 값과 같지 않으면

Let Worksheets("Sheet3").Cells(rngCell.Row, rngCell.Column) = rngCell

Sheet3의 같은 위치에 Sheet1의 해당 값을 넣습니다.

거의 영어 해석하는 것 같네요.


Sheet의 모든 값을 비교하는 로직을 이렇게 간단히 구현할 줄이야....


Excel Programming 하면 할 수록 더 재밌어 지는데요.



반응형

Comment

  1. 안녕하세요~포스팅 잘보고 갑니다.^^

  2. 홍용기 2014.02.06 02:41

    안녕하세요,
    저는 학생입니다.
    최근에 진행중인 프로젝트를 수행하다보니,
    여러 씨트에 대하여 반복작업을 수행한 후, 다시 종합해야 하는 일을 자주 만나곤 합니다.

    포스팅 덕분에 수작업을 줄일 수 있을거 같은 희망이 생깁니다.
    감사합니다.

    • 솔웅 2014.02.07 00:02 신고

      저도 이제 새로 배우는 중 입니다.
      좋은 정보 있으면 같이 나눠요. ^^