2015-11-08 114 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