Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
12
返回列表 发新帖
楼主: zwj8859

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

[复制链接]
 楼主| 发表于 2017-7-4 10:45 | 显示全部楼层
"爱疯"老师,麻烦你再帮助改改!
回复

使用道具 举报

发表于 2017-7-4 10:50 | 显示全部楼层
zwj8859 发表于 2017-7-4 10:45
"爱疯"老师,麻烦你再帮助改改!

10楼哪儿有问题?
回复

使用道具 举报

 楼主| 发表于 2017-7-4 11:07 | 显示全部楼层
谢谢!相减<=0时,不复制,再给改改
回复

使用道具 举报

发表于 2017-7-4 11:17 | 显示全部楼层
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列相减
                If B(Dic(temp), 4) > A(i, 4) = False Then 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用数组对比筛选4.rar (18.74 KB, 下载次数: 8)
回复

使用道具 举报

 楼主| 发表于 2017-7-4 11:45 | 显示全部楼层
“爱疯”老师,A,B相减<=0时,不复制。麻烦你帮助再改改!
回复

使用道具 举报

发表于 2017-7-4 12:00 来自手机 | 显示全部楼层
zwj8859 发表于 2017-7-4 11:45
“爱疯”老师,A,B相减

14楼结果哪个地方不对?
回复

使用道具 举报

发表于 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
复制代码
回复

使用道具 举报

 楼主| 发表于 2017-7-4 15:26 | 显示全部楼层
“爱疯”老师,当A,B数量相减<=0时,还是会复制到C区。要求不会复制过去,不知怎样改?另外请问Count = Count + 1: Dic(temp) = Count是什么意思?
回复

使用道具 举报

 楼主| 发表于 2017-7-4 15:31 | 显示全部楼层
X
+50/-150
S70
40
      40<50,还是复制过去了
323.jpg
回复

使用道具 举报

发表于 2017-7-4 15:41 | 显示全部楼层
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列相减
                If B(Dic(temp), 4) > A(i, 4) Then 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用数组对比筛选5.rar (19.1 KB, 下载次数: 21)
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-2 21:15 , Processed in 0.609110 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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