2015-11-08 110 views
1

如果OriData和Filterdata完全相同,我想比较2个动态命名范围(OriData和Filterdata),并将Filterdata设置为“(空)”(Filterdata是两次提前过滤的结果的OriData,我想将它归零,如果它们都相同的话)。我几乎没有想出这个代码,但它总是显示“不相似的范围”。这有什么错我的代码,我会深深体会到,如果你可以用编辑的代码,以满足我的需要出来(零中筛选数据,如果相同)在Excel中比较2个动态命名范围Vba

Sub Santa() 
    Dim Dn As Range 

    For Each Dn In Range("OriData") 

     If Not Dn = Range("Filterdata").Cells(Dn.Row, Dn.Column) Then MsgBox "Disimilar ranges": Exit Sub 

    Next Dn 

    MsgBox "Both Ranges have the same data" 

End Sub 

我真的新在VBA所以请原谅...... 在此先感谢!

回答

0

Dn.RowDn.Column是工作表上的行和列,而不是Range(“OriData”)内的相对行。当您尝试引用范围(“Filterdata”)中的姐妹单元格时,您没有引用相同的单元格位置。

Sub Santa() 
    Dim r As Long, c As Long 

    If Range("OriData").Count <> Range("Filterdata").Count Then 
     MsgBox "Dissimilar range sizes" 
     Exit Sub 
    End If 

    For r = 1 To Range("OriData").Rows.Count 
     For c = 1 To Range("OriData").Columns.Count 
      If Not Range("OriData").Cells(r, c) = Range("Filterdata").Cells(r, c) Then 
       MsgBox "Dissimilar range values" 
       Exit Sub 
      End If 
     Next c 
    Next r 

    MsgBox "Both Ranges have the same data" 

End Sub 
0

这使用了不同的方法。当范围很大时,循环浏览工作表是低效的。这里,范围首先被复制到变量中,然后进行比较。如果相同,则命名范围将被清除(值被删除)或删除(值和命名范围) - 如果需要取消注释。

包括错误检查。

代码使用有意义的变量名,以帮助理解和维护它随着时间的推移:

Sub DeleteIfIdentical() 
    Dim r As Long, c As Long 
    Dim ub1 As Long, ub2 As Long 
    Dim original, filtered ' arrays holding the named ranges' values 

    On Error GoTo NoSuchRange 
    original = Range("original") 
    filtered = Range("filtered") 
    On Error GoTo 0 

    ub1 = UBound(original, 1) 
    ub2 = UBound(original, 2) 
    If Not (UBound(filtered, 1) = ub1) And _ 
      (UBound(filtered, 2) = ub2) Then 
     MsgBox "Ranges are not identical!" 
     Exit Sub 
    End If 

    For r = 1 To ub1 
     For c = 1 To ub2 
      If original(r, c) <> filtered(r, c) Then 
       MsgBox "Ranges are not identical!" 
       Exit Sub 
      End If 
     Next c 
    Next r 

    MsgBox "Both Ranges have the same data" 
    Range("filtered").Clear ' to clear all values 
    ' Range("filtered").Delete ' to clear all values and delete the named range 
    Exit Sub 

NoSuchRange: 
    MsgBox "Error accessing named ranges 'orginal' and/or 'filtered'" 
End Sub