分享

Excel-VBA查找不重复值并返回最后一次的内容

 L罗乐 2017-09-07

应用场景

零售商品经常会调整价格,商品条码的唯一的,价格出现几条,取最新价格


知识要点

1:Collection 对象  是项目所组成的有序集合(不存在重复值)

2:Add方法,添加一个成员到Collection对象,object.add item key item为对象表达式指列表中的对象,item指定添加到集合的成员

3:Range.NumberFormatLocal 属性 返回或设置一个Variant值,代表对象的格式代码

4:Range.Sort 方法 对值区域进行排序。



Sub 查找最后一次价格()

    On Error Resume Next

    Dim only As New Collection, i As Integer, j As Integer

    Dim arr, arr2()

    arr = Range([a1], Cells(Rows.Count, 3).End(xlUp)).Value '将区域转化为数组,从而提速

    For i = UBound(arr) To 1 Step -1

    '遍历数组所有行,为了保留最后日期的价格,则从后向前循环

    '将数组第一列i行的品名添加到collection对象中,如果存在重复,仅取首次出现者

    only.Add arr(i, 1), CStr(arr(i, 1))

    If err = 0 Then  '如果没有错误(表示当前产品名称是第一次写入collection对象)

        j = j 1    '累加变量,该变量等于产品个数(不含重复值)

        ReDim Preserve arr2(1 To 3, 1 To j)

        '重新分配存储空间,(只能修改最末一维的大小)

        arr(1, j) = only(j)

        arr2(2, j) = arr(i, 2)

        arr2(3, j) = arr(i, 3)

    End If

    err.Clear  '循环每一次自动清除错误(必须的,否则不恩能够取出后面的产品、价格和日期)

    Next i

    [e1].Resize(j, 3) = WorksheetFunction.Transpose(arr2)  'arr2转置后写入单元格

    [g1].Resize(j, 1).NumberFormatLocal = 'm月d日' '将存放日期的单元格设置为日期格式

    [h1].Resize(j, 1) = Evaluate('=row(1:' & j & ')') '创建一个辅助区,利用它将倒序的数据修正

    '对产生的数据进行排序,以辅助区为标准倒序排列,可以使原本倒序的按原来的升序显示

    [e1].Resize(j, 4).Sort key1:=[h1], order1:=xlDescending, ordercustom:=1, oridntation:=xlTopToBottom, dataoption1:=xlSortNormal

    [h1].resieze(j, 1).Clear '清除辅助区

End Sub


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多