Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 8529|回复: 19

[已解决]VBA用数组进行对比筛选

[复制链接]
发表于 2017-7-4 08:52 | 显示全部楼层 |阅读模式
求助:VBA用数组进行对比筛选
最佳答案
2017-7-4 15:15
  1. Sub aaa()
  2. Dim arr, i&, d As Object, s$, brr, r&, c, crr
  3. Set d = CreateObject("scripting.dictionary")
  4. arr = [a3:d8]
  5. For i = 1 To UBound(arr)
  6.   If arr(i, 1) <> "" Then d(arr(i, 1) & "," & arr(i, 2) & "," & arr(i, 3)) = arr(i, 4)
  7. Next i
  8. arr = [f3:i8]
  9. For i = 1 To UBound(arr)
  10.   s = arr(i, 1) & "," & arr(i, 2) & "," & arr(i, 3)
  11.   If arr(i, 1) <> "" And d.exists(s) Then
  12.     d(s) = d(s) - arr(i, 4)
  13.   End If
  14. Next i
  15. ReDim brr(1 To UBound(arr), 1 To 4)
  16. For Each c In d.keys
  17.   If d(c) > 0 Then
  18.     r = r + 1
  19.     crr = Split(c, ",")
  20.     For i = 0 To 2
  21.       brr(r, i + 1) = crr(i)
  22.     Next i
  23.     brr(r, 4) = d(c)
  24.   End If
  25. Next c
  26. [l3].Resize(UBound(arr), 4) = brr
  27. End Sub
复制代码

VBA用数组对比筛选

VBA用数组对比筛选

VBA用数组对比筛选.rar

9.56 KB, 下载次数: 32

附件

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2017-7-4 10:03 | 显示全部楼层
Sub test()
    Dim Dic, Count, B()
    Set Dic = CreateObject("scripting.dictionary")
    ReDim B(1 To 10 ^ 4, 1 To 4)
    Call Compare(Dic, Count, [A3:D8].Value, B)
    Call Compare(Dic, Count, [F3:I8].Value, B)
    [L3:O65536] = ""
    [L3].Resize(Count, UBound(B, 2)) = B
End Sub

Sub Compare(Dic, Count, A, B)
    Dim i, j, temp
    For i = 1 To UBound(A)
        If A(i, 4) <> "" Then
            temp = A(i, 1) & A(i, 2) & A(i, 3)
            If Dic.exists(temp) Then
                '已存在,第4列相减
                B(Dic(temp), 4) = B(Dic(temp), 4) - A(i, 4)
            Else
                '不存在,赋值
                Count = Count + 1: Dic(temp) = Count
                For j = 1 To UBound(A, 2)
                    B(Count, j) = A(i, j)
                Next j
            End If
        End If
    Next i
End Sub
VBA用数组对比筛选2.rar (18.93 KB, 下载次数: 12)
回复

使用道具 举报

发表于 2017-7-4 10:03 | 显示全部楼层
以下确认:
1、会不会出现A没有而B有的情况,这种情况下怎么处理;
2、颜色&光度&品种相同的信息会不会在A和B内出现多次,这种情况下怎么处理;
回复

使用道具 举报

发表于 2017-7-4 10:07 | 显示全部楼层
2楼没考虑多次的情况
回复

使用道具 举报

 楼主| 发表于 2017-7-4 10:09 | 显示全部楼层
1、会不会出现A没有而B有的情况,这种情况下怎么处理?这种情况会有,A没有而B有,则不复制。
2、颜色&光度&品种相同的信息会不会在A和B内出现多次,这种情况下怎么处理?不会出现多次(即不会重复)
回复

使用道具 举报

 楼主| 发表于 2017-7-4 10:18 | 显示全部楼层
有问题,需要修改。存在问题:1、A没有而B有,则不复制,而现在也复制过去了;2、相减<=0时,也复制过去了。
回复

使用道具 举报

 楼主| 发表于 2017-7-4 10:20 | 显示全部楼层
ReDim B(1 To 10 ^ 4, 1 To 4)中的“10 ^ 4”不知什么意思?
回复

使用道具 举报

 楼主| 发表于 2017-7-4 10:29 | 显示全部楼层
A、B、C只是标识,主要为你们好理解才弄的,实际中没有标识。
回复

使用道具 举报

发表于 2017-7-4 10:37 | 显示全部楼层
zwj8859 发表于 2017-7-4 10:20
ReDim B(1 To 10 ^ 4, 1 To 4)中的“10 ^ 4”不知什么意思?

10^4,即10000条,是预测的条数,如不够大,手动修改。
回复

使用道具 举报

发表于 2017-7-4 10:43 | 显示全部楼层
Option Explicit

Sub test()
    Dim Dic, Count, B()
    Set Dic = CreateObject("scripting.dictionary")
    ReDim B(1 To 10 ^ 4, 1 To 4)
    Call Compare(Dic, Count, True, [A3:D8].Value, B)
    Call Compare(Dic, Count, False, [F3:I8].Value, B)
    [L3:O65536] = ""
    [L3].Resize(Count, UBound(B, 2)) = B
End Sub

Sub Compare(Dic, Count, bol, A, B)
    Dim i, j, temp
    For i = 1 To UBound(A)
        If A(i, 4) <> "" Then
            temp = A(i, 1) & A(i, 2) & A(i, 3)
            If Dic.exists(temp) Then
                '已存在,第4列相减
                B(Dic(temp), 4) = B(Dic(temp), 4) - A(i, 4)
            Else
                '不存在,赋值
                If bol Then
                    Count = Count + 1: Dic(temp) = Count
                    For j = 1 To UBound(A, 2)
                        B(Count, j) = A(i, j)
                    Next j
                End If
            End If
        End If
    Next i
End Sub
VBA用数组对比筛选3.rar (19.05 KB, 下载次数: 16)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-19 14:33 , Processed in 0.310626 second(s), 7 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表