programing

두 Excel 파일의 모든 셀을 비교하는 VBA 매크로

iphone6s 2023. 6. 26. 21:08
반응형

두 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을 복사합니다.

그러나 여기서는 두 가지 사례를 다루지 않습니다.

  1. 비교된 새 셀과 이전 셀이 동일한 데이터입니다(결과 셀은 비어 있음).
  2. 새 셀과 이전 셀이 서로 다른 데이터입니다(결과 셀은 비어 있음).

이 두 가지 경우도 다루려면 자신만의 기능을 만들어야 합니다. 즉, VBA를 학습하는 것입니다.매우 유용한 Excel 페이지는 cpearson.com 입니다.

언급URL : https://stackoverflow.com/questions/5387929/vba-macro-to-compare-all-cells-of-two-excel-files

반응형