Excel精英培训网

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

[已解决]求大神帮忙,vba根据excel内容筛选很急

[复制链接]
发表于 2016-11-22 20:26 | 显示全部楼层 |阅读模式
如附件所示,小弟需要根据“性别”表中的定义将表“名单1”“名单2”中的相应内容进行筛选。
如“性别”表中“性别”选为男,那么表“名单1”“名单2”自动筛选性别为男的行(女的行删掉或隐藏)。
求大神指点,不甚感激!

最佳答案
2016-11-23 11:34
  1. Private Sub Worksheet_Change(ByVal T As Range)
  2. Dim arr(0 To 60000, 1 To 3), stmArr, n As Integer
  3. Dim strPath As String, i As Long, strName As String
  4. Dim wb As Workbook, wbName As String, sh As Worksheet

  5. If T.Address <> "$A$2" Then Exit Sub '当不是A2单元格时,退出
  6. Application.ScreenUpdating = False
  7. strPath = ThisWorkbook.Path & ""
  8. strName = Dir(strPath & "*.XLS*")
  9. arr(0, 1) = "姓名": arr(0, 2) = "性别": arr(0, 3) = "工作簿名称"
  10. Do While strName <> ""
  11.     wbName = Split(strName, ".")(0)
  12.     If wbName <> "性别" Then
  13.        Set wb = Workbooks.Open(strPath & strName)
  14.        For Each sh In wb.Sheets
  15.             If sh.Range("a1") = "" Then GoTo 10
  16.             stmArr = sh.UsedRange
  17.             For n = 1 To UBound(stmArr)
  18.                 If stmArr(n, 2) = T.Value Then
  19.                 i = i + 1
  20.                 arr(i, 1) = stmArr(n, 1)
  21.                 arr(i, 2) = stmArr(n, 2)
  22.                 arr(i, 3) = wbName
  23.                 End If
  24. 10
  25.             Next
  26.         Next
  27.         wb.Close: Set wb = Nothing
  28.     End If
  29.     strName = Dir
  30. Loop
  31. Range("b2:d60002") = arr
  32. Application.ScreenUpdating = True
  33. End Sub
复制代码

自动筛选.rar

18.99 KB, 下载次数: 12

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2016-11-23 07:03 | 显示全部楼层
就用筛选就可以了

评分

参与人数 1 +1 收起 理由
ctmss + 1 多谢关注,再帮忙看看~

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2016-11-23 07:44 | 显示全部楼层
苏子龙 发表于 2016-11-23 07:03
就用筛选就可以了

因为表格很多,有好几十张,所以人工筛选很慢~
回复

使用道具 举报

 楼主| 发表于 2016-11-23 07:45 | 显示全部楼层
ctmss 发表于 2016-11-23 07:44
因为表格很多,有好几十张,所以人工筛选很慢~

而且筛选条件有好几个,所以想有个例子自己再改一下
回复

使用道具 举报

发表于 2016-11-23 07:45 | 显示全部楼层
为什么不放到一个工作薄?

评分

参与人数 1 +1 收起 理由
ctmss + 1 请问有没有办法实现呢~

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2016-11-23 08:28 | 显示全部楼层
望帝春心 发表于 2016-11-23 07:45
为什么不放到一个工作薄?

因为原始文件就是好几张表,每张表有不同的页我只需要处理不同表的同一页,由于原始文件不能上传,所以模拟了个比较简单的情况,自己再来修改。
回复

使用道具 举报

发表于 2016-11-23 10:12 | 显示全部楼层
ctmss 发表于 2016-11-23 08:28
因为原始文件就是好几张表,每张表有不同的页我只需要处理不同表的同一页,由于原始文件不能上传,所以模 ...

我是新手,不太会,等 大神出手相助吧

评分

参与人数 1 +1 收起 理由
ctmss + 1 thx

查看全部评分

回复

使用道具 举报

发表于 2016-11-23 11:34 | 显示全部楼层    本楼为最佳答案   
  1. Private Sub Worksheet_Change(ByVal T As Range)
  2. Dim arr(0 To 60000, 1 To 3), stmArr, n As Integer
  3. Dim strPath As String, i As Long, strName As String
  4. Dim wb As Workbook, wbName As String, sh As Worksheet

  5. If T.Address <> "$A$2" Then Exit Sub '当不是A2单元格时,退出
  6. Application.ScreenUpdating = False
  7. strPath = ThisWorkbook.Path & ""
  8. strName = Dir(strPath & "*.XLS*")
  9. arr(0, 1) = "姓名": arr(0, 2) = "性别": arr(0, 3) = "工作簿名称"
  10. Do While strName <> ""
  11.     wbName = Split(strName, ".")(0)
  12.     If wbName <> "性别" Then
  13.        Set wb = Workbooks.Open(strPath & strName)
  14.        For Each sh In wb.Sheets
  15.             If sh.Range("a1") = "" Then GoTo 10
  16.             stmArr = sh.UsedRange
  17.             For n = 1 To UBound(stmArr)
  18.                 If stmArr(n, 2) = T.Value Then
  19.                 i = i + 1
  20.                 arr(i, 1) = stmArr(n, 1)
  21.                 arr(i, 2) = stmArr(n, 2)
  22.                 arr(i, 3) = wbName
  23.                 End If
  24. 10
  25.             Next
  26.         Next
  27.         wb.Close: Set wb = Nothing
  28.     End If
  29.     strName = Dir
  30. Loop
  31. Range("b2:d60002") = arr
  32. Application.ScreenUpdating = True
  33. End Sub
复制代码

汇总性别.zip

29.63 KB, 下载次数: 9

评分

参与人数 1 +1 收起 理由
ctmss + 1 赞一个

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 19:36 , Processed in 0.459576 second(s), 19 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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