2017-05-11 8 views
0

2つのExcelブックを比較し、このワークブックの相違点を列挙しようとしています。2つのExcelワークブックを比較する:VBAアレイが等しくない

私は以下の行でエラー「タイプ不一致」取得しています:

If varSheetA <> varSheetB Then 

コード:

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

変数 'varSheetA'と' varSheetA'は、(1つの以上のセルの範囲のための)2次元アレイを含む、あなたが>< 'との全体の配列を比較することはできません。コードはまた、前述の修正を包含します演算子。ネストされたループ内の配列の各要素をチェックする必要があります。 – omegastripes

+0

これを修正する方法 – Stacey

答えて

1

あなたは配列のすべての要素をループするが、その後、比較しようとしていますアレイ全体がになります。これは<>で行うことはできません。あなたはどのようにシートをループにについてのあなたの心を変更し、そしてに忘れてしまったように見えます

:代わりに、ちょうどあなたが

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 

編集を比較しようとしている項目のインデックスを追加変数名を更新してください。たとえば、ShNameを定義していないときにShNameというシートを参照しようとしていて、shを定義していない場合は、行7+shに書き込もうとしています。また、ループとして使用する前に、変数としてiを宣言していませんでした。

また、ワークシートに可変タイプの不一致があると、タイプ不一致エラーが発生していますたとえば、あるセルにエラーがあり、そのセルの整数が他のシートにある場合は、<>を使用してこれらの値を比較することはできません。以下のコードでは、変数型チェックを含めました。詳細はコメントを参照してください。

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

この行にある場合varSheetA(iRow、iCol)<> varSheetB(iRow、iCol)Then – Stacey

+0

私は奇妙なようにシートオブジェクトを使い始めましたか? – Wolfie

+0

その使用方法を教えてください – Stacey

関連する問題