두 Excel 파일의 모든 셀을 비교하는 VBA 매크로
두개의 Excel 파일을 비교해서 새 파일에만 있는 것을 한 장에 저장하고 이전 파일에만 있는 것을 다른 장에 저장하려고 합니다. (기본적으로)new - old = sheet1그리고.old - new = sheet2.) 한 SO 답변은 모든 셀을 순환하고 간단한 비교를 수행할 것을 제안합니다.저는 (매우) VBA와 매크로를 처음 사용하기 때문에 이 작업을 수행하는 방법을 모릅니다.어떻게 수행됩니까? (또는 어디서 배울 수 있습니까?)
모든 셀을 반복해서 사용하지 마십시오.읽기와 쓰기 모두 워크시트와 VBA 사이의 통신에는 많은 오버헤드가 있습니다.모든 세포를 순환하는 것은 고통스러울 정도로 느릴 것입니다.몇 시간 동안 얘기하고 있어요.
대신 전체 시트를 한 번에 변형 배열에 로드합니다.Excel 2003의 경우 이 작업은 약 2초(250MB의 RAM)가 소요됩니다.그러면 당신은 그것을 순식간에 반복할 수 있습니다.
Excel 2007 이상에서는 시트가 약 1000배 더 큽니다(Excel 2003의 경우 65536행 x 256열 = 1700만 개에 비해 1048576행 x 16384열 = 170억 개 셀).전체 시트를 Variant에 로드하려고 하면 "메모리 부족" 오류가 발생합니다. 제 컴퓨터에서는 한 번에 3200만 개의 셀만 로드할 수 있습니다.따라서 실제 데이터가 포함된 범위로 제한하거나 시트를 한 번에 30열씩 로드해야 합니다.
Option Explicit
Sub test()
Dim varSheetA As Variant
Dim varSheetB As Variant
Dim strRangeToCheck As String
Dim iRow As Long
Dim iCol As Long
strRangeToCheck = "A1:IV65536"
' If you know the data will only be in a smaller range, reduce the size of the ranges above.
Debug.Print Now
varSheetA = Worksheets("Sheet1").Range(strRangeToCheck)
varSheetB = Worksheets("Sheet2").Range(strRangeToCheck) ' or whatever your other sheet is.
Debug.Print Now
For iRow = LBound(varSheetA, 1) To UBound(varSheetA, 1)
For iCol = LBound(varSheetA, 2) To UBound(varSheetA, 2)
If varSheetA(iRow, iCol) = varSheetB(iRow, iCol) Then
' Cells are identical.
' Do nothing.
Else
' Cells are different.
' Code goes here for whatever it is you want to do.
End If
Next iCol
Next iRow
End Sub
다른 워크북의 시트와 비교하려면 해당 워크북을 열고 다음과 같이 시트를 가져옵니다.
Set wbkA = Workbooks.Open(filename:="C:\MyBook.xls")
Set varSheetA = wbkA.Worksheets("Sheet1") ' or whatever sheet you need
셀 수식으로 수행할 수 있는 매우 간단한 검사:
시트 1(신규 - 구형)
=(if(AND(Ref_New<>"";Ref_Old="");Ref_New;"")
시트 2(구 - 새)
=(if(AND(Ref_Old<>"";Ref_New="");Ref_Old;"")
이 공식은 영어 Excel에 적용되어야 합니다.다른 언어의 경우 번역이 필요합니다. (독일어의 경우 제가 지원할 수 있습니다.
3개의 엑셀 문서를 모두 열고 첫 번째 공식을 시트 1의 A1에 복사하고 두 번째 공식을 시트 2의 A1에 복사해야 합니다.첫 번째 셀의 A1을 클릭하고 "Ref_New"를 표시하면 참조를 선택하고 새 파일로 이동하여 A1을 클릭한 다음 시트 1로 돌아가서 이전 파일의 "Ref_Old"에 대해 동일한 작업을 수행할 수 있습니다.다른 "Ref_New"도 교체합니다.
시트 2에 대해서도 동일하게 수행합니다.
이제 zour 데이터가 이전 파일과 새 파일에 있는 전체 범위에서 공식 A1을 복사합니다.
그러나 여기서는 두 가지 사례를 다루지 않습니다.
- 비교된 새 셀과 이전 셀이 동일한 데이터입니다(결과 셀은 비어 있음).
- 새 셀과 이전 셀이 서로 다른 데이터입니다(결과 셀은 비어 있음).
이 두 가지 경우도 다루려면 자신만의 기능을 만들어야 합니다. 즉, VBA를 학습하는 것입니다.매우 유용한 Excel 페이지는 cpearson.com 입니다.
언급URL : https://stackoverflow.com/questions/5387929/vba-macro-to-compare-all-cells-of-two-excel-files
'programing' 카테고리의 다른 글
| 메이븐에서 여러 스프링 부트 애플리케이션에 대한 엔드 투 엔드 통합 테스트 (0) | 2023.06.26 |
|---|---|
| TypeScript가 가져온 상수가 정의되지 않았습니다. (0) | 2023.06.26 |
| 운영체제 수준에서 수면은 어떻게 구현됩니까? (0) | 2023.06.26 |
| 그룹의 행 번호 증분 (0) | 2023.06.26 |
| Oracle 10g에서 문자열 날짜를 날짜 형식으로 변환하는 방법 (0) | 2023.06.26 |