Excel精英培训网

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

[VBA] VBA这句代码如何改为用数组判断

[复制链接]
发表于 2016-12-9 20:27 | 显示全部楼层 |阅读模式
VBA这句代码如何改为用数组判断


Function SumIFColor(RNG As Range, 颜色单元格 As Range, Optional 统计区)
  Dim arr(), Item, i As Long    '声明变量
  If IsMissing(统计区) Then  '如果第三参数被忽略
    '则将“条件区”当作“统计区”,并将它赋值给数组变量arr(使用数组可对代码提速)
    arr = Intersect(RNG, RNG.Parent.UsedRange).Value
  Else             '否则
    '将“统计区”参数重置为“条件区”的相同高度和宽度,然后赋值给数组变量arr
    arr = 统计区(1).Resize(RNG.Rows.Count, RNG.Columns.Count).Value
  End If
  For Each Item In arr  '遍历数组arr
    i = i + 1     '累加计数器
    '如果条件区中某个单元格背景色与颜色单元格区域(参照区)颜色一致


    If RNG.Cells(i).Interior.Color = 颜色单元格(1).Interior.Color Then             '................这句代码如何改为用数组判断

      SumIFColor = SumIFColor + Item '将数组中对应的数值累加到SumIFColor中
    End If
  Next
End Function



'这句代码 If RNG.Cells(i).Interior.Color = 颜色单元格(1).Interior.Color Then    .............. 这句代码如何改为用数组判断


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2016-12-9 20:34 | 显示全部楼层
回复

使用道具 举报

 楼主| 发表于 2016-12-9 20:52 | 显示全部楼层
回复

使用道具 举报

发表于 2016-12-9 21:07 | 显示全部楼层
laoau138 发表于 2016-12-9 20:52
什么时候飞到   EP论坛

想不到这个论坛你都是我前辈了,五年级了,我才幼儿园

回复

使用道具 举报

 楼主| 发表于 2016-12-9 21:37 | 显示全部楼层
huang1314wei 发表于 2016-12-9 21:07
想不到这个论坛你都是我前辈了,五年级了,我才幼儿园

继续努力啊,我认得你了


回复

使用道具 举报

发表于 2016-12-9 22:44 | 显示全部楼层
这个还真想不出来,单元格的填充颜色,怎么也得都需要用单元格调用吧,range.Interior.Color,
读取对象的属性和用数组相比,速度差别不大;
对单元格赋值的话,先用数组运算,会快不少,当然需要处理数据比较大的时候,才能比较明显的表现出来。  
这是我的理解。

评分

参与人数 1 +3 收起 理由
laoau138 + 3 来学习

查看全部评分

回复

使用道具 举报

发表于 2016-12-9 22:50 | 显示全部楼层
倒是有个想法,用二维数组,arr(n,1 to 2)     第一维存放单元格的数值,第二维存放对应单元格的填充色颜色值,然后用一个循环就可以判断了。  只是还要先用循环给数组赋值,感觉得不偿失

评分

参与人数 1 +3 收起 理由
laoau138 + 3 来学习

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2016-12-10 07:31 | 显示全部楼层
一沫昔阳虹w 发表于 2016-12-9 22:50
倒是有个想法,用二维数组,arr(n,1 to 2)     第一维存放单元格的数值,第二维存放对应单元格的填充色颜色 ...

要怎样才能实现
回复

使用道具 举报

发表于 2016-12-10 12:13 | 显示全部楼层
  1. Function SumIFColor(RNG As Range, 颜色单元格 As Range, Optional 统计区)
  2.   Dim arr(), Item, i As Long    '声明变量
  3.     '-------------------------------------------------------------------
  4.   Dim count As Long, color As Long, tempRng As Range
  5.     '-------------------------------------------------------------------
  6.   If IsMissing(统计区) Then  '如果第三参数被忽略
  7.     '则将“条件区”当作“统计区”,并将它赋值给数组变量arr(使用数组可对代码提速)
  8. '    arr== Intersect(RNG, RNG.Parent.UsedRange).Value
  9.     Set tempRng = Intersect(RNG, RNG.Parent.UsedRange)
  10.   Else             '否则
  11.     '将“统计区”参数重置为“条件区”的相同高度和宽度,然后赋值给数组变量arr
  12. '    arr = 统计区(1).Resize(RNG.Rows.count, RNG.Columns.count).Value
  13.     Set tempRng = 统计区(1).Resize(RNG.Rows.count, RNG.Columns.count)
  14.   End If
  15.   '-------------------------------------------------------------------
  16.   color = 颜色单元格(1).Interior.color
  17.   count = tempRng.count
  18.   ReDim arr(1 To 2, 1 To count)
  19.   For i = 1 To count        '赋值
  20.         arr(1, i) = tempRng(i)
  21.         arr(2, i) = tempRng(i).Interior.color
  22.         If arr(2, i) = color Then SumIFColor = SumIFColor + arr(1, i)
  23.   Next
  24.   '-------------------------------------------------------------------
  25. '  For Each Item In arr  '遍历数组arr
  26. '    i = i + 1     '累加计数器
  27. '    '如果条件区中某个单元格背景色与颜色单元格区域(参照区)颜色一致
  28. '
  29. '    If RNG.Cells(i).Interior.color = 颜色单元格(1).Interior.color Then             '................这句代码如何改为用数组判断
  30. '
  31. '      SumIFColor = SumIFColor + Item '将数组中对应的数值累加到SumIFColor中
  32. '    End If
  33. '  Next
  34. End Function
复制代码


评分

参与人数 1 +3 收起 理由
laoau138 + 3 来学习

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2016-12-10 12:41 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-30 23:21 , Processed in 1.347202 second(s), 13 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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