Excel精英培训网

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

[已解决]按条件填充颜色

[复制链接]
发表于 2015-1-21 16:00 | 显示全部楼层 |阅读模式
本帖最后由 meet10010 于 2015-1-22 18:42 编辑

按条件填充颜色
最佳答案
2015-1-22 15:08
  1. Sub Macro1()
  2. Dim arr, brr(1 To 65000, 1 To 1), w(9)
  3. arr = [a22:iv24]
  4. n = 100 'UBound(arr, 2)
  5. For a = 2 To n - 3
  6.     For b = a + 1 To n - 2
  7.         For c = b + 1 To n - 1
  8.             For d = c + 1 To n
  9.                 w(arr(1, a)) = arr(1, a)
  10.                 w(arr(1, b)) = arr(1, b)
  11.                 w(arr(1, c)) = arr(1, c)
  12.                 w(arr(1, d)) = arr(1, d)
  13.                 w(arr(3, a)) = arr(3, a)
  14.                 w(arr(3, b)) = arr(3, b)
  15.                 w(arr(3, c)) = arr(3, c)
  16.                 w(arr(3, d)) = arr(3, d)
  17.                 If Len(Join(w, "")) = 8 Then s = s + 1: brr(s, 1) = a & "," & b & "," & c & "," & d
  18.                 Erase w
  19.                 If s > 60000 Then GoTo line100
  20.             Next
  21.         Next
  22.     Next
  23. Next
  24. line100:
  25. '结果代表符合数据所在的列
  26. Range("a26").Resize(s) = brr
  27. End Sub
复制代码

as3.rar

14.72 KB, 下载次数: 35

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2015-1-21 16:33 | 显示全部楼层
如果结果过多,点击按钮一次实现一次结果,相信楼主会没有这个耐心的
回复

使用道具 举报

 楼主| 发表于 2015-1-21 16:38 | 显示全部楼层
本帖最后由 meet10010 于 2015-1-21 17:13 编辑
dsmch 发表于 2015-1-21 16:33
如果结果过多,点击按钮一次实现一次结果,相信楼主会没有这个耐心的

只要能实现,有的。查找到的4列不要重复太多则更好。
回复

使用道具 举报

发表于 2015-1-21 20:30 | 显示全部楼层
这样看行不
  1. Sub t()
  2.     Dim rg As Range, rng As Range, rgg As Range
  3.     Dim lc&, arrRg As Range, dic As Object
  4.     lc = Cells(22, Columns.Count).End(1).Column  '最大列数
  5.     Set arrRg = Union([A22].Resize(, lc), [A24].Resize(, lc))
  6.     arrRg.Interior.Pattern = xlNone    '无填充色
  7.     On Error Resume Next
  8.     Set rng = Application.InputBox("请选择四个不同列的单元格!按ctrl键多选。", , , , , , , 8)
  9.     If rng.Count <> 4 Then MsgBox "请选择四个不同列的单元格": Exit Sub
  10.     For Each rg In rng
  11.         If rgg Is Nothing Then
  12.             Set rgg = rg.EntireColumn  '单元格的整列
  13.         Else
  14.             Set rgg = Union(rgg, rg.EntireColumn)
  15.         End If
  16.     Next
  17.     Set rgg = Application.Intersect(rgg, arrRg)  '行列单元格交集,应该等到8个单元格
  18.     If rgg.Count <> 8 Then MsgBox "请选择四个不同列的单元格": Exit Sub
  19.     Set dic = CreateObject("scripting.dictionary")
  20.     For Each rg In rgg            '遍历单元格
  21.         dic(rg.Value) = ""        '记入字典
  22.     Next
  23.     If dic.Count = 8 Then rgg.Interior.Color = 255 '字典数为8时执行填充
  24. End Sub
复制代码
回复

使用道具 举报

发表于 2015-1-22 10:29 | 显示全部楼层
  1. Sub Macro1()
  2. Dim arr, brr(1 To 60000, 1 To 1), w(9)
  3. arr = [a22:iv24]
  4. n = 100 'UBound(arr, 2)
  5. For a = 2 To n - 3
  6.     For b = a + 1 To n - 2
  7.         For c = b + 1 To n - 1
  8.             For d = c + 1 To n
  9.                 w(arr(1, a)) = arr(1, a)
  10.                 w(arr(1, b)) = arr(1, b)
  11.                 w(arr(1, c)) = arr(1, c)
  12.                 w(arr(1, d)) = arr(1, d)
  13.                 w(arr(3, a)) = arr(3, a)
  14.                 w(arr(3, b)) = arr(3, b)
  15.                 w(arr(3, c)) = arr(3, c)
  16.                 w(arr(3, d)) = arr(3, d)
  17.             Next
  18.             If Len(Join(w, "")) = 8 Then s = s + 1: brr(s, 1) = a & "," & b & "," & c & "," & d
  19.             Erase w
  20.         Next
  21.     Next
  22. Next
  23. '结果代表符合数据所在的列
  24. Range("a26").Resize(s) = brr
  25. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2015-1-22 10:55 | 显示全部楼层
本帖最后由 meet10010 于 2015-1-22 10:58 编辑
dsmch 发表于 2015-1-22 10:29

非常感谢老师的代码,很强大,安排结果也很合理。

但是求得结果不对,求得的4列中,有的不是8个不同的数字。麻烦老师再看看。

as33.rar

80.65 KB, 下载次数: 5

回复

使用道具 举报

发表于 2015-1-22 15:08 | 显示全部楼层    本楼为最佳答案   
  1. Sub Macro1()
  2. Dim arr, brr(1 To 65000, 1 To 1), w(9)
  3. arr = [a22:iv24]
  4. n = 100 'UBound(arr, 2)
  5. For a = 2 To n - 3
  6.     For b = a + 1 To n - 2
  7.         For c = b + 1 To n - 1
  8.             For d = c + 1 To n
  9.                 w(arr(1, a)) = arr(1, a)
  10.                 w(arr(1, b)) = arr(1, b)
  11.                 w(arr(1, c)) = arr(1, c)
  12.                 w(arr(1, d)) = arr(1, d)
  13.                 w(arr(3, a)) = arr(3, a)
  14.                 w(arr(3, b)) = arr(3, b)
  15.                 w(arr(3, c)) = arr(3, c)
  16.                 w(arr(3, d)) = arr(3, d)
  17.                 If Len(Join(w, "")) = 8 Then s = s + 1: brr(s, 1) = a & "," & b & "," & c & "," & d
  18.                 Erase w
  19.                 If s > 60000 Then GoTo line100
  20.             Next
  21.         Next
  22.     Next
  23. Next
  24. line100:
  25. '结果代表符合数据所在的列
  26. Range("a26").Resize(s) = brr
  27. End Sub
复制代码
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 02:54 , Processed in 0.738933 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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