ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 5286|回复: 6

[原创] 较高级的单元格底色、字体颜色相关自定义函数

[复制链接]

TA的精华主题

TA的得分主题

发表于 2014-3-4 09:48 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:自定义函数开发
最近连续碰到坛友求助、需要依据单元格底色来统计单元格个数,或求和。

原因:
由于初学者喜欢对单元格颜色作标注,作为区分某种特性的方法(比较直观)
而不是按照正规的表格做法单独做一列属性,
因此这样手工标注单元格底色的表格,很难进行统计、筛选和处理。(2010等高版本除外)

但Excel 2003等低版本不支持对单元格底色进行判断的函数,因此没有直接利用的方法。
有一种方法是使用宏表函数,但有一个较大的缺点:还需要再写一个自己需要的计算、统计函数,且不够直观。

因此,我研究开发了、可以和工作表函数一样直接使用的VBA自定义函数:
  1. Function SC(Sum_range, ColorCell, Optional ColorId_Type = 0)
  2.    '【参数1: Sum_range】   单元格矩形区域
  3.   '【参数2: ColorCell】      指定底色的单元格(单一单元格)
  4.    '【参数3: ColorId_Type】 指定底色的颜色代码ColorIndex 或模式,默认=0
  5.    '【功能】返回单元格底色颜色代码
  6.   '           /或按指定单元格底色进行范围内数值求和统计/或统计区域内同底色单元格个数

  7.     If ColorId_Type > 0 And ColorId_Type < 57 Then
  8.         C_Index = ColorId_Type '如果第3参数值不为0 且数值在1-56范围内则该参数用作指定底色的颜色代码
  9.    Else
  10.         C_Index = ColorCell.Interior.ColorIndex '否则以第2参数指定单元中的底色作为指定底色
  11.         If ColorId_Type = -2 Then '如果第3参数=-2则函数返回当前指定单元格底色的颜色代码
  12.             SC = C_Index '「-2」時、色コード出力
  13.         If SC = -4142 Then SC = 0 '当默认无底色时结果转为=0输出
  14.             Exit Function '结束函数过程退出
  15.         ElseIf ColorId_Type = -3 Then '如果第3参数=-3 则返回指定单元格的字体颜色FontColor
  16.             SC = ColorCell.Font.ColorIndex
  17.         If SC = -4105 Then SC = 0 '如果字体默认黑色结果转为=0输出
  18.             Exit Function '结束函数过程退出
  19.         End If
  20.     End If

  21.     '当第3参数默认=0或第3参数=-1时,已将第2参数中单元格底色作为标准色
  22.    '下面开始统计第1参数对象区域中,所有相同底色单元格中的结果   
  23.     For i = 1 To Sum_range.Cells.Count '遍历区域中所有单元格
  24.         If Sum_range.Cells(i).Interior.ColorIndex = C_Index Then '如果底色相同则
  25.             If ColorId_Type < 0 Then
  26.                 SC = SC + 1 '如果第3参数=-1时,仅仅统计同底色单元格的个数
  27.             Else '如果第3参数默认=0时
  28.                 If IsNumeric(Sum_range.Cells(i)) Then
  29.                     SC = SC + Sum_range.Cells(i)
  30.                     '如果同底色单元格中为数值(含文本数值)时求总和。
  31.                 End If
  32.              End If
  33.         End If
  34.     Next
  35. End Function
复制代码
补充,第3参数直接指定底色代码时,函数统计返回第1参数区域中和指定底色相同的单元格中的数值的总和。

需要指定底色时,可以灵活应用第2参数来指定底色。

比如,固定把A1作为指定底色的单元格,那么当改变A1底色时,函数能够自动按新的指定底色进行统计。
(需要用格式刷改变A1单元格底色,否则函数不会自动计算。)

TA的精华主题

TA的得分主题

发表于 2014-4-7 08:01 | 显示全部楼层
学习收藏了,谢谢!

TA的精华主题

TA的得分主题

发表于 2014-4-7 11:48 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
做个记号,有空再研究怎么用!!

TA的精华主题

TA的得分主题

发表于 2014-4-12 11:35 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2017-3-21 00:35 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2017-6-22 12:45 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
学习收藏了,谢谢!

TA的精华主题

TA的得分主题

发表于 2017-11-17 15:03 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
发现当颜色改变时,不能自动计算, 不知有哪位,遇到同样的问题没.
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-12-22 01:01 , Processed in 0.043481 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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