2012-06-03 86 views
0

我对excel不是很有经验 - 我更喜欢c#的人 - 希望一些excel的大师能够帮助我在这里!Excel独特价值查询

基本上我有一个电子表格只有一列文本数据(列a)。我需要查询这个数据列表。

我将需要基本上将一些更多的文本数据复制到另一列(让我们说列b),然后过滤掉列b中已存在于a列某处的记录,只留下唯一的唯一记录在列b中,但不是列a。

我试过使用先进的过滤器,但似乎无法得到它的工作。任何关于如何做到这一点的提示或建议都会很棒。

谢谢

回答

1

可以动态筛选数据,说与公式C柱像

=IF(ISNA(VLOOKUP(B1,A:A,1,FALSE)),B1,"") 

然后过滤非空单元格列C

否则,这个简单的宏将清除重复的地方

Sub FilterDuplicates() 
    Dim r As Range 
    For Each r In ActiveSheet.Columns("B").Cells 
    If r.Value <> "" Then 
     On Error Resume Next 
     WorksheetFunction.VLookup r, ActiveSheet.Columns("A"), 1, False 
     If Err.Number = 0 Then r.ClearContents 
     On Error GoTo 0 
    End If 
    Next r 
End Sub 
0

这应该做你所需要的。它在A列的B列中查找每个值,并在找到匹配项时删除该单元格。将数据粘贴到列B后运行代码。请注意,它不会从列B中删除重复项,它只是删除列B中列A中的所有值。要从列B中删除重复值,请选择列并从Data选项卡中选择Remove Duplicates

你需要一个模块添加到工作簿,然后插入模块下面的代码:

代码:

Option Explicit 

Sub RemoveMatchesFromColumn() 
    On Error Resume Next 

    Dim LastRow As Long 
    Dim SearchText As String 
    Dim MatchFound As String 

    LastRow = Range("b" & ActiveSheet.Rows.Count).End(xlUp).Row 
    SearchText = Range("b" & LastRow).Value 

    Do Until LastRow = 0 

    MatchFound = Find_Range(SearchText, Columns("A")).Value 
     If SearchText = MatchFound Then 
      Range("b" & LastRow).Delete Shift:=xlUp 
     End If 
     LastRow = LastRow - 1 
     SearchText = Range("b" & LastRow).Value 
    Loop 

End Sub 


Function Find_Range(Find_Item As Variant, _ 
    Search_Range As Range, _ 
    Optional LookIn As Variant, _ 
    Optional LookAt As Variant, _ 
    Optional MatchCase As Boolean) As Range 

    ' Function written by Aaron Blood 
    ' http://www.ozgrid.com/forum/showthread.php?t=27240 

    Dim c As Range 
    Dim firstAddress As Variant 
    If IsMissing(LookIn) Then LookIn = xlValues 'xlFormulas 
    If IsMissing(LookAt) Then LookAt = xlPart 'xlWhole 
    If IsMissing(MatchCase) Then MatchCase = False 

    With Search_Range 
     Set c = .Find(_ 
     What:=Find_Item, _ 
     LookIn:=LookIn, _ 
     LookAt:=LookAt, _ 
     SearchOrder:=xlByRows, _ 
     SearchDirection:=xlNext, _ 
     MatchCase:=MatchCase, _ 
     SearchFormat:=False) 
     If Not c Is Nothing Then 
      Set Find_Range = c 
      firstAddress = c.Address 
      Do 
       Set Find_Range = Union(Find_Range, c) 
       Set c = .FindNext(c) 
      Loop While Not c Is Nothing And c.Address <> firstAddress 
     End If 
    End With 

End Function 

运行子RemoveMatchesFromColumn。你可以进入它看看它在做什么F8或运行它与F5

0

NON VBA METHOD

将这个公式中细胞C1

=IF(VLOOKUP(B1,A:A,1,0)=B1,"DELETE ME","") 

拖动它,直到结束。然后过滤Col C上的数据DELETE ME然后删除重复的数据。

VBA方法

Option Explicit 

Sub Sample() 
    Dim ws As Worksheet 
    Dim lRow As Long, i As Long 
    Dim delRange As Range, aCell As Range 

    Set ws = Sheets("Sheet1") 
    With ws 
     lRow = .Range("B" & Rows.Count).End(xlUp).Row 
     For i = 1 To lRow 
      Set aCell = .Columns(1).Find(What:=.Range("B" & i).Value, _ 
         LookIn:=xlValues, LookAt:=xlWhole, _ 
         SearchOrder:=xlByRows, SearchDirection:=xlNext, _ 
         MatchCase:=False, SearchFormat:=False) 

      If Not aCell Is Nothing Then 
       If delRange Is Nothing Then 
        Set delRange = .Range("B" & i) 
       Else 
        Set delRange = Union(delRange, .Range("B" & i)) 
       End If 
      End If 
     Next i 
     If Not delRange Is Nothing Then delRange.Delete shift:=xlUp 
    End With 
End Sub