오늘 동료가 두개의 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 하면 할 수록 더 재밌어 지는데요.
'etc. > Excel Programming' 카테고리의 다른 글
[VBA] Userform 만들기 (0) | 2014.02.21 |
---|---|
[VBA] Developer 메뉴 보이게 하기 (0) | 2014.02.21 |
[VBA] inputBox 살펴보기 (0) | 2014.02.20 |
[VBA] Range Return 하기 (2) | 2014.02.12 |
[VBA] 엑셀과 Teradata 연동하기 (0) | 2014.02.07 |
[VBA] 다른 함수 호출하기/파라미터 전달하기 (2) | 2014.02.05 |
VBA (Excel) - 필터링 한 후 합계 구하기 (0) | 2014.01.07 |
VBA (Excel) - 특정 Column 의 합계 구하기 (0) | 2014.01.06 |
EXCEL Programming - 새로운 sheet 만들기 (0) | 2014.01.06 |
EXCEL Programming - Macro 만들기와 Visual Basic Editor 보기 (4) | 2013.12.26 |