2017-05-11 12 views
0

Ich versuche, zwei Excel-Arbeitsmappen zu vergleichen und die Unterschiede in dieser Arbeitsmappe aufzulisten.Vergleichen Sie zwei Excel-Arbeitsmappen: VBA-Arrays nicht gleich

Ich erhalte Fehler "Typ stimmt nicht überein" in der unteren Zeile:

If varSheetA <> varSheetB Then 

Code:

Sub compareworkb() 

    Dim varSheetA As Variant 
    Dim varSheetB As Variant 
    Dim strRangeToCheck As String 
    Dim iRow As Long 
    Dim iCol As Long 
    Set wbkA = Workbooks.Open(Filename:="C:\Solution - Beginners template .xlsx") 
    Set wbkB = Workbooks.Open(Filename:="C:\Template_Project Lead - Beginners.xlsx") 

    For i = 1 To wbkA.Sheets.Count  
     Set varSheetA = wbkA.Worksheets(wbkA.Sheets(i).Name) 
     Set varSheetB = wbkB.Worksheets(wbkB.Sheets(i).Name) 

     strRangeToCheck = "A1:N100" 

     Debug.Print Now 
     varSheetA = varSheetA.Range(strRangeToCheck) 
     varSheetB = varSheetB.Range(strRangeToCheck) 
     Debug.Print Now 
     For iRow = LBound(varSheetA, 1) To UBound(varSheetA, 1) 
      For iCol = LBound(varSheetA, 2) To UBound(varSheetA, 2)  
       If varSheetA <> varSheetB Then 
        wbkB.Sheets(ShName).Cells(iRow, iCol).Interior.Color = vbYellow 
        ThisWorkbook.Sheets(1).Cells(7 + sh, 2) = "Mismatch Found" 
        ThisWorkbook.Sheets(1).Cells(7 + sh, 2).Interior.Color = vbYellow 
       End If 
      Next 
     Next 
    Next i 
End Sub 
+0

Variablen 'varSheetA' und' varSheetA' enthalten 2-dimensionalen Arrays (für Bereiche von mehr als 1 Zelle), können Sie die ganze Arrays mit nicht vergleichen kann '<> 'Betreiber. Es ist notwendig, jedes Element des Arrays innerhalb von verschachtelten Schleifen zu überprüfen. – omegastripes

+0

Vorschläge, wie man es ändert – Stacey

Antwort

1

Sie sind durch jedes Element der Arrays Looping, aber dann zu vergleichen versuchen die ganze Arrays jedes Mal, was nicht mit <> getan werden kann. Stattdessen fügen Sie einfach den Index der Elemente versuchen Sie

For iRow = LBound(varSheetA, 1) To UBound(varSheetA, 1) 
    For iCol = LBound(varSheetA, 2) To UBound(varSheetA, 2) 
    ' Note this change vvvvv     vvvvvv 
     If varSheetA(iRow,iCol) <> varSheetB(iRow,iCol) Then 
      wbkB.Sheets(ShName).Cells(iRow, iCol).Interior.Color = vbYellow 
      ThisWorkbook.Sheets(1).Cells(7 + sh, 2) = "Mismatch Found" 
      ThisWorkbook.Sheets(1).Cells(7 + sh, 2).Interior.Color = vbYellow 
     End If 
    Next iCol 
Next iRow 

bearbeiten vergleichen:

Es sieht aus wie Sie Ihre Meinung darüber, wie eine Schleife durch die Blätter geändert haben, und vergessen Aktualisieren Sie die Variablennamen. Zum Beispiel versuchen Sie, das Blatt ShName zu referenzieren, wenn Sie ShName nicht definiert haben, und Sie versuchen, in Zeile 7+sh zu schreiben, wenn Sie sh nicht definiert haben! Sie haben auch i nicht als Variable deklariert, bevor Sie sie zur Schleife verwenden.

Außerdem erhalten Sie einen Typenkonfliktfehler , wenn ein Variablentyp in Ihrem Arbeitsblatt nicht übereinstimmt! Wenn Sie beispielsweise einen Fehler in einer Zelle und eine Ganzzahl in der entsprechenden Zelle auf dem anderen Blatt haben, können Sie diese Dinge nicht mit <> vergleichen. Im folgenden Code habe ich eine Überprüfung des Variablentyps eingefügt, siehe Kommentare für Details. Der Code umfasst auch die zuvor Korrekturen erwähnt:

Sub compareworkb() 
    Dim varSheetA As Variant 
    Dim varSheetB As Variant 
    Dim strRangeToCheck As String 
    Dim iRow As Long 
    Dim iCol As Long 
    Dim i As Long 
    Dim mismatch As Boolean 
    Set wbkA = ThisWorkbook 
    Set wbkB = Workbooks("test2.xlsx") 

    strRangeToCheck = "A1:N100" ' Define this once outside the loop, as it doesn't change 
    For i = 1 To wbkA.Sheets.Count 
     varSheetA = wbkA.Worksheets(i).Range(strRangeToCheck) 
     varSheetB = wbkB.Worksheets(i).Range(strRangeToCheck) 

     For iRow = LBound(varSheetA, 1) To UBound(varSheetA, 1) 
      For iCol = LBound(varSheetA, 2) To UBound(varSheetA, 2) 
       mismatch = False 
       ' Check that cell values are the same variable type 
       If VarType(varSheetA(iRow, iCol)) = VarType(varSheetB(iRow, iCol)) Then 
        ' If they are the same variable type, we can compare them! 
        If varSheetA(iRow, iCol) <> varSheetB(iRow, iCol) Then 
         mismatch = True 
        End If 
       Else ' If they are not the same variable type, then it must be a mismatch       
        mismatch = True 
       End If 
       ' If mismatch found then note it/colour corresponding cell 
       If mismatch Then 
        wbkB.Sheets(i).Cells(iRow, iCol).Interior.Color = vbYellow 
        ThisWorkbook.Sheets(1).Cells(7 + i, 2) = "Mismatch Found" 
        ThisWorkbook.Sheets(1).Cells(7 + i, 2).Interior.Color = vbYellow 
       End If 
      Next iCol 
     Next iRow 
    Next i 
End Sub 
+0

In dieser Zeile Wenn varSheetA (iRow, iCol) <> varSheetB (iRow, iCol) Dann – Stacey

+0

Haben Sie begonnen, Blattobjekte wie ich suggeted zu verwenden? – Wolfie

+0

können Sie mich, wie Sie das verwenden – Stacey

Verwandte Themen