用VBA比较两个excel工作簿

用VBA比较两个excel工作簿,vba,excel,Vba,Excel,是的,我知道还有一些其他相关的话题,但我认为如果我再创造一个会更好,因为这是一种不同的方式。无论如何,如果有人认为我没有遵守论坛规则,请做你必须做的事情 我一直在关注这一点,即比较两本工作簿。因为我想比较两个内容相同的excel文件,所以我编写了一个非常相似的代码。但是,我的代码似乎没有比较这两个文件,而是比较文件A和文件A,或者文件B和文件B 代码所做的是获取两个工作簿,获取名为Balance Sheet的工作表,然后比较两个工作簿中的资产负债表是否具有相同的值。因此,我们不必在所有单元格中循

是的,我知道还有一些其他相关的话题,但我认为如果我再创造一个会更好,因为这是一种不同的方式。无论如何,如果有人认为我没有遵守论坛规则,请做你必须做的事情

我一直在关注这一点,即比较两本工作簿。因为我想比较两个内容相同的excel文件,所以我编写了一个非常相似的代码。但是,我的代码似乎没有比较这两个文件,而是比较文件A和文件A,或者文件B和文件B

代码所做的是获取两个工作簿,获取名为Balance Sheet的工作表,然后比较两个工作簿中的资产负债表是否具有相同的值。因此,我们不必在所有单元格中循环,这些表被加载到一个变量数组中。你可以看到一张资产负债表的图片,只是想了解一下:

我的代码是:

Sub CompareWorkbooks()

Dim varSheetA As Variant
Dim varSheetB As Variant
Dim strRangeToCheck As String
Dim iRow As Long
Dim iCol As Long

nlin = 1
ncol = 1

'Get the worksheets from the workbooks
Set wbkA = Workbooks.Open(Filename:="C:\Users\Desktop\BalanceSheet.xls")
Set varSheetA = wbkA.Worksheets("Balance sheet") ' or whatever sheet you need

Set wbkB = Workbooks.Open(Filename:="C:\Users\Desktop\BalanceSheet_old.xls")
Set varSheetB = wbkB.Worksheets("Balance sheet") ' or whatever sheet you need

strRangeToCheck = "B6:D49"
' If you know the data will only be in a smaller range, reduce the size of the ranges above.
Debug.Print Now
varSheetA = Worksheets("Balance Sheet").Range(strRangeToCheck)
varSheetB = Worksheets("Balance Sheet").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. Let's fill our main template with the information
            Windows(MainTemplate.xlsm).Activate
            Cells(nlin, ncol) = varSheetA(iRow, 2) 'Gives the name of the changed field
            Cells(nlin, ncol + 1) = varSheetA(iRow, iCol) 'Gives me the value in workbookA
            Cells(nlin, ncol + 2) = varSheetB(iRow, iCol) 'Gives me the value in workbookB
            Cells(nlin, ncol + 3) = nlin 'Gives me the row location
            Cells(nlin, ncol + 4) = ncol 'Gives me the column location
            nlin = nlin + 1
        End If
    Next
Next

End Sub
有人能猜出错误在哪里吗?为什么我没有得到不同的细胞


另外,我发现了一个新问题,我是否可以在不必给出具体名称的情况下浏览所有表格?在我的代码中,我必须插入“资产负债表”作为表名,但是如果我有多个工作表呢?即使是通过循环,是否有人有这样的好主意,即不会使我的excel内存不足或变得太慢?

您使用的是Workbook a so set sheetB

Set varSheetB = wbkA.Worksheets("Balance sheet") ' or whatever sheet you need
应该是:

Set varSheetB = wbkB.Worksheets("Balance sheet") ' or whatever sheet you need
varSheetA = varSheetA.Range(strRangeToCheck)
varSheetB = varSheetB.Range(strRangeToCheck)
对不起,我第一次错过了这个:

varSheetA = Worksheets("Balance Sheet").Range(strRangeToCheck)
varSheetB = Worksheets("Balance Sheet").Range(strRangeToCheck)
应该是:

Set varSheetB = wbkB.Worksheets("Balance sheet") ' or whatever sheet you need
varSheetA = varSheetA.Range(strRangeToCheck)
varSheetB = varSheetB.Range(strRangeToCheck)
直接调用Worksheets函数将始终引用Active工作簿。 而是始终从相关对象(wkbA.Worksheets(“…”)或wkbB.Worksheets(“…”)调用它

顺便说一句,您也可以将两项作业合并为一项:

strRangeToCheck = "B6:D49"
Set wbkA = Workbooks.Open(Filename:="C:\Users\Desktop\BalanceSheet.xls")
Set varSheetA = wbkA.Worksheets("Balance sheet").Range(strRangeToCheck)
Set wbkB = Workbooks.Open(Filename:="C:\Users\Desktop\BalanceSheet_old.xls")
Set varSheetB = wbkB.Worksheets("Balance sheet").Range(strRangeToCheck)

等等,我刚刚更改了这部分代码,但仍然没有得到不同的单元格。它工作得很好,谢谢!我不得不更新我的问题并添加一个新问题,但你真的已经帮了我很多!