Excel精英培训网

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

[已解决]用VBA做复杂的筛选。

[复制链接]
发表于 2017-10-27 13:25 | 显示全部楼层 |阅读模式
本帖最后由 mate88 于 2017-10-28 11:41 编辑

用VBA做复杂的筛选。
最佳答案
2017-10-28 10:55
这样行不行,你试一下。
  1. Sub aaa()
  2. Dim arr, brr, i&, j&, ar1, ar2, ar3, s1$, s2$, s3$, r&, n&
  3. arr = [f1].CurrentRegion
  4. ReDim brr(1 To UBound(arr), 1 To UBound(arr, 2))
  5. ar1 = [f1000].Resize(10, UBound(arr, 2))
  6. ar2 = [f1011].Resize(10, UBound(arr, 2))
  7. ar3 = [f1022].Resize(10, UBound(arr, 2))
  8. For j = 1 To UBound(arr, 2)
  9.   r = 0
  10.   s1 = Join(Application.Transpose(Application.Index(ar1, , j)), "")
  11.   s2 = Join(Application.Transpose(Application.Index(ar2, , j)), "")
  12.   s3 = Join(Application.Transpose(Application.Index(ar3, , j)), "")
  13.   For i = 1 To UBound(arr)
  14.     If arr(i, j) = "" Then Exit For
  15.     If InStr(s1, Left(arr(i, j), 1)) = 0 And InStr(s2, Mid(arr(i, j), 2, 1)) = 0 And InStr(s3, Right(arr(i, j), 1)) = 0 Then
  16.       r = r + 1
  17.       If n < r Then n = r
  18.       brr(r, j) = arr(i, j)
  19.     End If
  20.   Next i
  21. Next j
  22. [f1035].CurrentRegion.ClearContents
  23. [f1035].Resize(n, UBound(brr, 2)) = brr
  24. End Sub
复制代码

筛选.rar

43.85 KB, 下载次数: 25

发表于 2017-10-27 14:01 | 显示全部楼层
确认规则:
1、需剔除数据中重复数据的意义是什么,如F列第1位1、5、1,为什么有两个1;
2、F列举例中的003是否应该剔除,因为第3位里面有3
回复

使用道具 举报

 楼主| 发表于 2017-10-27 14:26 | 显示全部楼层
大灰狼1976 发表于 2017-10-27 14:01
确认规则:
1、需剔除数据中重复数据的意义是什么,如F列第1位1、5、1,为什么有两个1;
2、F列举例中的0 ...

谢谢老师的回复。
1.给定的数据有时重复,如三位数的第1位给定了1,5,1.其实即是按1,5。因为不论哪个位置数据都是0-9. 这10个数。
2.F列的003要剔除的。因为第3位中给定了3.符合给定条件,要剔除掉。 凡是含有给定条件位置的数字都剔除。余下的数据填入对应列的下面。
回复

使用道具 举报

发表于 2017-10-27 15:14 | 显示全部楼层
  1. Sub aaa()
  2. Dim arr, brr, i&, j&, ar1, ar2, ar3, s1$, s2$, s3$, r&
  3. arr = [f1].CurrentRegion
  4. ReDim brr(1 To UBound(arr), 1 To UBound(arr, 2))
  5. ar1 = [f1000:w1009]: ar2 = [f1011:w1020]: ar3 = [f1022:w1031]
  6. For j = 1 To UBound(arr, 2)
  7.   r = 0
  8.   s1 = Join(Application.Transpose(Application.Index(ar1, , j)), "")
  9.   s2 = Join(Application.Transpose(Application.Index(ar2, , j)), "")
  10.   s3 = Join(Application.Transpose(Application.Index(ar3, , j)), "")
  11.   For i = 1 To UBound(arr)
  12.     If arr(i, j) = "" Then Exit For
  13.     If InStr(s1, Left(arr(i, j), 1)) = 0 And InStr(s2, Mid(arr(i, j), 2, 1)) = 0 And InStr(s3, Right(arr(i, j), 1)) = 0 Then
  14.       r = r + 1
  15.       brr(r, j) = arr(i, j)
  16.     End If
  17.   Next i
  18. Next j
  19. [f1035].Resize(r, UBound(brr, 2)) = brr
  20. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2017-10-27 17:26 | 显示全部楼层
本帖最后由 mate88 于 2017-10-27 18:49 编辑

你好老师,2个问题,麻烦老师看下。

筛选3.rar

221.55 KB, 下载次数: 7

回复

使用道具 举报

发表于 2017-10-28 09:03 | 显示全部楼层
问题回答如下:
1、源数据区域是按F1单元格的当前区域来确定的,如果前面还有数据的话,最前面的列最好是确定的,数据向后添加没有问题,源数据区不要出现空列。
2、在满足第1项条件后,自适应列数增加没有问题,但所在行不要变。
3、可以实现,加个判断就行
回复

使用道具 举报

 楼主| 发表于 2017-10-28 09:25 | 显示全部楼层
大灰狼1976 发表于 2017-10-28 09:03
问题回答如下:
1、源数据区域是按F1单元格的当前区域来确定的,如果前面还有数据的话,最前面的列最好是 ...

早上好老师!
1.操作的数据是按F列开始的,只有时候F列前面的列会有内容。若有代码也能正常运行就更好了。
2.给定的蓝色数据区域,行是不变的,只是列数向右会有增减。
谢谢老师!
回复

使用道具 举报

 楼主| 发表于 2017-10-28 09:42 | 显示全部楼层
大灰狼1976 发表于 2017-10-28 09:03
问题回答如下:
1、源数据区域是按F1单元格的当前区域来确定的,如果前面还有数据的话,最前面的列最好是 ...

第1点如不好达到,也可不用。麻烦老师完善下代码非常谢谢。
回复

使用道具 举报

发表于 2017-10-28 09:51 | 显示全部楼层
mate88 发表于 2017-10-28 09:25
早上好老师!
1.操作的数据是按F列开始的,只有时候F列前面的列会有内容。若有代码也能正常运行就更好了 ...

源数据起始列为F列,了解,但是要确定区域比较麻烦,最好前面不要有数据,必须要有的话,也跟F列之间保持一个空列。
其他应该没有太大问题,我等下有时间再处理一下。
回复

使用道具 举报

 楼主| 发表于 2017-10-28 09:54 | 显示全部楼层
大灰狼1976 发表于 2017-10-28 09:51
源数据起始列为F列,了解,但是要确定区域比较麻烦,最好前面不要有数据,必须要有的话,也跟F列之间保持 ...

好的好的,谢谢老师!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-6 17:08 , Processed in 0.418689 second(s), 11 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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