VBA-如何更改比较单元格以比较行

时间:2015-06-26 02:10:03

标签: excel vba excel-vba

我想更改以下代码来比较整行而不是单个单元格。我是vba的初学者,所以请简单解释一下。

Sub RunCompare()
    Call compareSheets("Sheet1", "Sheet2")
    End Sub
    Sub compareSheets(shtBefore As String, shtAfter As String)
    'Compares sheets by cells and highlight difference
    Dim MyCell As Range
    Dim mydiffs As Integer
    For Each MyCell In ActiveWorkbook.Worksheets(shtAfter).UsedRange
        If Not MyCell.Value = ActiveWorkbook.Worksheets(shtBefore).Cells(MyCell.Row, MyCell.Column).Value Then
            MyCell.Interior.Color = vbYellow
            mydiffs = mydiffs + 1
        End If
    Next
    MsgBox mydiffs & " differences found", vbInformation
    ActiveWorkbook.Sheets(shtAfter).Select
    End Sub

2 个答案:

答案 0 :(得分:0)

没有办法比较行。您可以改进当前的方法。
1.将mydiffs设置为long类型(vba初始值为long,因此不需要转换为整数)
2.添加Application.ScreenUpdating = False以增强脚本性能。

Sub RunCompare()
    Call compareSheets("Sheet1", "Sheet2")
End Sub
Sub compareSheets(shtBefore As String, shtAfter As String)
    'Compares sheets by cells and highlight difference
    Dim MyCell As Range
    Dim mydiffs As Long
    Application.ScreenUpdating = False
    For Each MyCell In ActiveWorkbook.Worksheets(shtAfter).UsedRange
        If Not MyCell.Value = ActiveWorkbook.Worksheets(shtBefore).Cells(MyCell.Row, MyCell.Column).Value Then
            MyCell.Interior.Color = vbYellow
            mydiffs = mydiffs + 1
        End If
    Next
    MsgBox mydiffs & " differences found", vbInformation
    ActiveWorkbook.Sheets(shtAfter).Select
    Application.ScreenUpdating = True
End Sub

答案 1 :(得分:0)

Range对象在Excel中是一个奇怪的野兽,它可以让一些人习惯它的各种特征。

短语

ActiveWorkbook.Worksheets(shtAfter).UsedRange

提供Range对象,当您使用循环时

For Each MyCell In ActiveWorkbook.Worksheets(shtAfter).UsedRange

您实际执行的操作是隐式依赖Cells对象的Range属性来传递包含该范围内所有单元格的对象。 Excel的帮助系统(至少在Office 2010版本中)也表明后一个对象是Range对象,我怀疑这是初学者之间混淆的原因,因为每个单元格也是Range对象本身(因此Cells的{​​{1}}属性提供的对象也是Range,虽然与其父对象不同,并且具有“元素”,每个元素都是{ {1}})

上面的循环实际上是

的简写形式

Range

Range对象有许多属性,其中一个属性是For Each MyCell In ActiveWorkbook.Worksheets(shtAfter).UsedRange.Cells属性。短语

Range

提供包含Rows的单独行的对象,然后您可以使用循环,例如

ActiveWorkbook.Worksheets(shtAfter).UsedRange.Rows

依次查看每一行。这里UsedRange也是一个Range对象。同样,也许令人困惑的是,For each myRow in ActiveWorkbook.Worksheets(shtAfter).UsedRange.Rows属性还提供了一个myRow对象,其中包含“元素”,每个元素也是Rows对象。

不幸的是,您不能隐含地依赖Range属性和Range对象来遍历每行中的单个单元格。所以

Cells

无法正常工作,但明确添加myRow属性

For each myCell in myRow

确实

总结,您可以通过使用两个循环来逐行进行比较:第一个用于行(基于Cells属性),第二个用于嵌套在第一个,对于一行中的单元格(基于For each myCell in myRow.Cells属性)。

除了之外,您可以根本不需要使用VBA来完成所需的操作。 Excel中的数组公式(从公式栏输入时需要CTL + SHIFT + ENTER的公式)可以比较两个数组。例如,数组公式

Rows

告诉两个不同工作表的范围A1:Z1是否相同,还有其他数组公式可用于计算两个范围之间的差异数。

如果要突出显示两个工作表中单元格之间的差异,请使用条件格式。这里的技巧是使用第一个单元格上的公式设置条件格式,然后将此格式复制到其他单元格。因此,使用公式

设置单元格Cells的条件格式

{=AND(Sheet1!A1:Z1=Sheet2!A1:Z1)}

确保公式使用相对Sheet2!A1而非绝对=Sheet1!A1<>Sheet2!A1单元格地址(必要时编辑公式),然后使用A1格式(使用$A$1)单元格CopyPaste Special Format上的其他单元格。