ExcelHome技术论坛

标题: 突破Excel【筛选】限制(条件个数和颜色限制) [打印本页]

作者: huanglicheng    时间: 2014-4-22 09:18
标题: 突破Excel【筛选】限制(条件个数和颜色限制)
本帖最后由 huanglicheng 于 2014-4-25 15:14 编辑

真正的把数据做成筛选的样式,和隐藏行不一样的方法(筛选后可以直接复制或标颜色等操作)。
研究发现 在筛选状态下
把行的行高设置为0 即可把该行排除在筛选之外。(这个方法取消筛选后行高还是原来的行高,不会受影响。【超好用】
如:     Rows(12).Rowheight = 0举例说明:表格中筛选是筛选了第2列为a的数据,运行代码后 第2到第10行也被排除了
  1. Sub test()
  2.     Range("2:10").RowHeight = 0
  3. End Sub
复制代码
(, 下载次数: 154)

反之设置行高大于0即可显示在筛选范围中(这个不建议使用,会改变原始行高
Range("12:12").Rows.AutoFit 或  Rows(12).Rowheight = 12
也举列说明: (在列表中添加了11行和15行到筛选结果中)
  1. Sub test()
  2.     Range("11:11,15:15").RowHeight = Rows(1).RowHeight
  3. End Sub
复制代码
(, 下载次数: 122)


通过上面的方法 设置的行号相当于筛选 筛出来的行一样,标颜色或其他操作都不会影响未筛选出来的行。


以下是详细样例(在2003版下筛选多个条件,同时筛选第2列单元格中 为 a 或c 或e 的单元格)
当然还可以更多,更多的条件,类似于高级筛选
[attach]1579474[/attach]
(, 下载次数: 117)
有了此方法,那什么多颜色筛选的。多条件筛选什么的 都不是事。

原理:
1、循环把不符合条件的行号 存起来
   如 利用union 都存到myRng 中
2、利用筛选把所有行都显示出来(筛选条件可以设为<>#@,随便一些表格中没有的字符都可以)
  Cells.AutoFilter 2, "<>#@"  (这里的2是指列号)
3、把存起来的不符合条件的行 的行高都设置 为0 即可
    如:myRng.rowheight=0
4、最后留下来的就是符合条件的。而且留下的行跟筛选后的一样的效果 ,行号是蓝色的。
特别说明:取消筛选后,被设置行高为0的行 还是原来的行高,不会受到影响




作者: huanglicheng    时间: 2014-4-22 09:35
功能延伸: 多颜色筛选
(, 下载次数: 93)

作者: 东亚五金    时间: 2014-4-22 09:53
这个以前还真不知道
作者: huanglicheng    时间: 2014-4-22 10:01
功能延伸: 多条件筛选
(, 下载次数: 61)

作者: huanglicheng    时间: 2014-4-22 10:24
这个对于以前用代码 来隐藏行添加辅助列的方式来筛选。可实用多了。看来对这个关注的人蛮少的,没人看那我就自己偷偷使用着^_^

作者: VBA万岁    时间: 2014-4-22 11:02
huanglicheng 发表于 2014-4-22 09:35
功能延伸: 多颜色筛选

这个能发个附件或代码吗?谢谢!
作者: coby001    时间: 2014-4-22 11:32
Excel筛选限制 指的是 自动筛选的下拉列表中只能显示1000个备选项目?

与其设置行高,不如设置为 隐藏,不会改变行高。
作者: 592rmb    时间: 2014-4-22 11:39
嗯,原来这样都可以啊
作者: huanglicheng    时间: 2014-4-22 11:41
coby001 发表于 2014-4-22 11:32
Excel筛选限制 指的是 自动筛选的下拉列表中只能显示1000个备选项目?

与其设置行高,不如设置为 隐藏, ...

行高=0 在筛选状态下是不会改变行高的,这就是这个功能好处,在说隐藏行不适合选定标色和复制。选定标色会把中间的行也标上颜色。
作者: huanglicheng    时间: 2014-4-22 11:43
coby001 发表于 2014-4-22 11:32
Excel筛选限制 指的是 自动筛选的下拉列表中只能显示1000个备选项目?

与其设置行高,不如设置为 隐藏, ...

我这的筛选的限制是指不能多条件筛选,或不能按多个颜色筛选。
作者: coby001    时间: 2014-4-22 11:46
本帖最后由 coby001 于 2014-4-22 11:48 编辑
huanglicheng 发表于 2014-4-22 11:41
行高=0 在筛选状态下是不会改变行高的,这就是这个功能好处,在说隐藏行不适合选定标色和复制。选定标色会 ...

行高=0 在筛选状态下

行高=0 和 隐藏 是等价 的。 隐藏 的设置步骤要简单。

在筛选状态下 操作的意义是: 排除该行数据

手工排除 了,相当于 人工筛选,还不如用 高级筛选。

作者: huanglicheng    时间: 2014-4-22 12:05
coby001 发表于 2014-4-22 11:46
行高=0 在筛选状态下

行高=0 和 隐藏 是等价 的。 隐藏 的设置步骤要简单。

您还没有真正明白我的意思。采用代码来排除,会很快的。
隐藏行不能实现 直接选择单元格来标颜色功能。用隐藏的方法也不能直接复制到新表。
如4楼的多条件筛选 是可以实现选择标颜色,而不影响其他行的。

以下面的代码 为例  not就是排除的意思
  1.    For i = 2 To ir
  2.         If Not arr(i, 2) Like "[ace]" Then d(i) = 0
  3.     Next i
复制代码

作者: coby001    时间: 2014-4-22 12:06
huanglicheng 发表于 2014-4-22 12:05
您还没有真正明白我的意思。采用代码来排除,会很快的。
隐藏行不能实现 直接选择单元格来标颜色功能。用 ...

你说的这些,都是高级筛选的功能啊何必重复发明轮子?

作者: huanglicheng    时间: 2014-4-22 12:13
coby001 发表于 2014-4-22 12:06
你说的这些,都是高级筛选的功能啊何必重复发明轮子?

好了,不和你抬扛,随你怎么弄。
作者: coby001    时间: 2014-4-22 12:16
huanglicheng 发表于 2014-4-22 12:13
好了,不和你抬扛,随你怎么弄。

没抬杠啊,你做这个相当于人工筛选辅助工具,那还不如用现成的高级筛选。。
作者: office8424    时间: 2014-4-22 12:19
一人献一朵花,大家别吵,我就是来看看,学学的有什么不懂的还请麻烦两位大哥日后指教拉!!!
作者: huanglicheng    时间: 2014-4-22 12:19
VBA万岁 发表于 2014-4-22 11:02
这个能发个附件或代码吗?谢谢!

你要的附件在这,你可以选中一个或多个颜色 ,点击按钮试试
(, 下载次数: 50)

作者: huanglicheng    时间: 2014-4-22 12:43
发这个帖,主要目的扩展一下大家的思路。说不定看了这个方法 打开了大家excel--vba的另一扇门。从而能做出更多更实用的功能。
作者: VBA万岁    时间: 2014-4-22 13:47
huanglicheng 发表于 2014-4-22 12:19
你要的附件在这,你可以选中一个或多个颜色 ,点击按钮试试

方便把代码发过来吗?
我用的是2010,打开附件时,代码及VBE对象丢失。
作者: huanglicheng    时间: 2014-4-22 14:01
VBA万岁 发表于 2014-4-22 13:47
方便把代码发过来吗?
我用的是2010,打开附件时,代码及VBE对象丢失。
供参考
  1. Sub 筛选单元格颜色()
  2.     On Error GoTo line
  3.     Dim i As Long, ic%, myColor, Rng As Range, ir As Long    '行变量,当前列号,当前颜色值,单元格选区
  4.     Dim myRng As Range, j%, q As Long, qq%
  5.     Dim d As Object, dic As Object
  6.     Set d = CreateObject("scripting.dictionary")
  7.     Set dic = CreateObject("scripting.dictionary")
  8.     '--------------------------------------------------
  9.     arr = Range(ActiveSheet.Range("a1"), ActiveSheet.Cells.SpecialCells(xlLastCell))  '把表中数据赋值给数值
  10.     If IsArray(arr) = False Then MsgBox "当前表格中没有数据,或只有一个数据": Exit Sub
  11.     ir = UBound(arr): Erase arr
  12.     '--------------------------------------------------
  13.     For Each Rng In Selection
  14.         myColor = Rng.Interior.Color
  15.         ic = Rng.Column
  16.         d(ic & "|" & myColor) = 0
  17.         dic(ic) = 0
  18.     Next
  19.     '--------------------------------------------------
  20.     Application.ScreenUpdating = False    '关闭屏闪'
  21.     a = dic.keys: ic = dic.Count
  22.     For i = 2 To ir
  23.         qq = 0
  24.         '--------------------------------------------------
  25.         For j = 0 To ic - 1
  26.             myColor = Cells(i, a(j)).Interior.Color
  27.             If d.exists(a(j) & "|" & myColor) = True Then qq = qq + 1 Else Exit For
  28.         Next j
  29.         '--------------------------------------------------
  30.         If qq = ic Then
  31.             q = q + 1
  32.         Else
  33.             If myRng Is Nothing Then Set myRng = Rows(i) Else Set myRng = Union(myRng, Rows(i))
  34.         End If
  35.     Next i
  36.     '--------------------------------------------------
  37.     If q > 0 Then
  38.         Application.ScreenUpdating = False
  39.         Cells.AutoFilter ActiveCell.Column, "<>#@"
  40.         myRng.RowHeight = 0
  41.         ActiveWindow.ScrollRow = 1    '窗口跳转到第1行
  42.         Application.ScreenUpdating = True
  43.     End If
  44. line:
  45.     Application.ScreenUpdating = True
  46. End Sub
复制代码



作者: huangxinsheng    时间: 2014-4-22 14:17
真的很神奇,下载下来看一看。
作者: aman1516    时间: 2014-4-22 14:18
huanglicheng 发表于 2014-4-22 14:01
供参考

研究精神值得赞扬!
不管用函数方法、菜单操作,控件操作,VBA代码实现都好,在解决问题时根据实际情况可能都有不同的优点。
不同的方式与功能的组合,会延伸出更多实用功能,这或许就是VBA的魅力吧。
当然,对于更多人来说,或许虽然条条大路通罗马,但只要抓到老鼠就是好猫了。
作者: VBA万岁    时间: 2014-4-22 14:42
huanglicheng 发表于 2014-4-22 14:01
供参考

我研究看看。
谢谢!
作者: ellen嘉    时间: 2014-4-22 20:02
第一次听说,很方便!
作者: 欣语    时间: 2014-4-23 10:21
用什么录屏软件呀,分享下Q458744067
作者: lemontree    时间: 2014-4-23 12:19
学些了,超级好用,牛人啊
作者: huanglicheng    时间: 2014-4-25 10:02
再顶一下,希望更多人能知道
作者: サルのモモ    时间: 2017-8-4 09:45
真厉害,这都想的出来的,刚想找这样子的,真聪明




欢迎光临 ExcelHome技术论坛 (https://club.excelhome.net/) Powered by Discuz! X3.4