比较A列和B列的数据一次

时间:2015-10-02 09:49:04

标签: excel excel-vba vba

我目前正在分析来自Excel的数据,并希望对A列和B列中的数据进行比较,以识别重复数据。我使用以下代码:

var svgobject = document.getElementsByClassName(".getFit");
for (var i=0; i<svgObject.length; i++)     
    var svgDoc = svgObject[i].contentDocument;
    var linkElm = svgDoc.createElementNS("http://www.w3.org/1999/xhtml", "link");
    linkElm.setAttribute("href", "getFitStyle.css");
    linkElm.setAttribute("type", "text/css");
    linkElm.setAttribute("rel", "stylesheet");
    svgDoc.getElementById("where-to-insert").appendChild(linkElm);
}

此代码取自MSDN,因此如果在C列中找到与A列匹配的匹配项,它将在B列中显示匹配的数字。大多数情况下,它会执行我需要的操作。但是,我希望修改此代码,以便它只匹配列表中的一个数字。

代码当前的作用示例:

Sub Find_Matches()
Dim CompareRange As Variant, x As Variant, y As Variant
Set CompareRange = Range("c2", Range("c2").End(xlUp))

For Each x In Selection
    For Each y In CompareRange
        If x = y Then x.Offset(0, 1) = x
    Next y
Next x
End Sub

基本上,因为数字1在C列中出现一次,所以A列不断找到匹配项。

我希望它能做的是:

A2  B2  C2
1   1   1
1   1   2
1   1   3

因为数字1只出现在C列一次,它只应与A列中的数字匹配一次。

我认为这可能很简单,但我似乎无法确定逻辑。有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:1)

根据您希望程序的速度和数据集的大小,对重复项的测试可能很简单或复杂。

我个人赞成Collection对象,因为它有一个唯一的密钥,并且测试该密钥的存在非常快,特别是如果数据集很大的话。通过查看在查询特定键的Collection时代码是否抛出错误来完成唯一测试。有些人在哲学上反对测试错误 - 我不得不说我是一个,所以我实际上更喜欢Dictionary对象,但对于这个平凡的任务,我不会通过步骤来引用它。 / p>

您还会看到下面的代码适用于数组而不是工作表本身的单元格 - 再次,只是个人品味的问题,因为它更快。

Const SOURCE_COL As String = "A"
Const SOURCE_START_ROW As Long = 2
Const COMPARE_COL As String = "C"
Const COMPARE_START_ROW As Long = 2
Const OUTPUT_COL As String = "B"

Dim ws As Worksheet
Dim sourceValues As Variant
Dim compareValues As Variant
Dim outputValues() As Variant
Dim sourceIndex As Long
Dim compareIndex As Long
Dim uniques As Collection
Dim val As Variant
Dim key As String
Dim exists As Variant

Set ws = ThisWorkbook.Worksheets("Sheet1")
sourceValues = ws.Range(ws.Cells(SOURCE_START_ROW, SOURCE_COL), _
                        ws.Cells(Rows.Count, SOURCE_COL).End(xlUp)).Value2

compareValues = ws.Range(ws.Cells(COMPARE_START_ROW, COMPARE_COL), _
                         ws.Cells(Rows.Count, COMPARE_COL).End(xlUp)).Value2

Set uniques = New Collection
ReDim outputValues(1 To UBound(sourceValues, 1), 1 To 1)

For sourceIndex = 1 To UBound(sourceValues, 1)

    val = sourceValues(sourceIndex, 1)
    key = CStr(val)
    exists = Empty
    On Error Resume Next
    exists = uniques(key)
    On Error GoTo 0

    If IsEmpty(exists) Then

        For compareIndex = 1 To UBound(compareValues, 1)
            If val = compareValues(compareIndex, 1) Then
                outputValues(sourceIndex, 1) = val
                uniques.Add val, key
                Exit For
            End If
        Next

    End If

Next

ws.Cells(SOURCE_START_ROW, OUTPUT_COL).Resize(UBound(outputValues, 1)).Value = outputValues