Excel精英培训网

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

[已解决]VBA自定义函数缺省值的疑问

[复制链接]
发表于 2012-12-27 19:50 | 显示全部楼层 |阅读模式
在FUNCTION过程,会设置一些缺省值。假如有这样一个自定义函数 按颜色(背景色或字体色求和或计数)
  1. '第三参数决定求和与计数,值为True时求和,值为False时计数;第四参数决字按单元格背景还是字体色计算
  2. Function Color(参照颜色区 As Range, 统计区 As Range, Optional SumOrCount As Boolean = False, Optional BackOrFont As Boolean = False)
  3.   Application.Volatile
  4.   Dim cell As Range, Colors, SUM, i
  5.   '如果第三参数是True则按背景色求和,否则按字体色求和
  6.   Colors = IIf(BackOrFont, 参照颜色区(1).Interior.Color, 参照颜色区(1).Font.Color)
  7.   For Each cell In 统计区  '遍历求和区
  8.     If BackOrFont Then
  9.       If cell.Interior.Color = Colors Then SUM = SUM + IIf(IsNumeric(cell), cell, 0): i = i + 1  '背景色相同则累加数值及计数器
  10.     Else
  11.       If cell.Font.Color = Colors Then SUM = SUM + IIf(IsNumeric(cell), cell, 0): i = i + 1  '字体色相同则累加数值及计数器
  12.     End If
  13.   Next cell
  14.   Color = IIf(SumOrCount, SUM, i)  '将合计数赋与函数,成为最终颜色求和结果
  15. End Function
复制代码
5c4d65299473c680a2c431f195c26ead.png
我的疑问是这样的,像图中第一种情况,省略了后面两个参数,都按默认的FASLE处理,像第三种情况,省略了第三个参数,但是还是有逗号的。这里无论是怎么样的省略形式(完全省略参数,即也省略了逗号。或有逗号但没有参数)的结果都是一样的。但在工作表函数中,比如说LEFT,=LEFT(A1)省略了第二个参数,也没有逗号。这里会按默认的截取一个字符处理。但是,=LEFT(A1,)这种情况,会按0处理。工作表函数中对这两种省略形式的省略是不一样的。但是,在VBA自定义函数是,是一样的,我感觉很疑惑。。不知道我的这个结论对不对,还希望大家指点一样。

最佳答案
2012-12-27 21:09
zhoucs00 发表于 2012-12-27 21:03
您说的第二段话"不管什么函数中判断你指不指定参数的 关键符号是 ,(逗号),另一个关键就是 参数的类型 ...

你应该这么理解,因为你定义了第三个参数的数据类型为boolean(逻辑值),当你添加了,(逗号),就表示你需要指定这个参数的值,而你什么都不输入,其实是表示你输入的是0,而并不是让这个参数默认,之所以他的作用跟你默认的效果一样,是因为在VBA中,当参数类型为boolean时,如果你输入一个数值,等于0的就按照False来处理了而已。

发表于 2012-12-27 20:03 | 显示全部楼层
第三个参数是 SumOrCount  

你的代码最后才用了第三个参数

Color = IIf(SumOrCount, SUM, i)  '将合计数赋与函数,成为最终颜色求和结果

你仔细看一下呢??
回复

使用道具 举报

 楼主| 发表于 2012-12-27 20:25 | 显示全部楼层
无聊的疯子 发表于 2012-12-27 20:03
第三个参数是 SumOrCount  

你的代码最后才用了第三个参数

代码之前有判断是按背景色还是按字体颜色IF BackOrFont THEN ELSE来统计了的,就产生了两套SUM 与 I 。最后再根据SUMORCOUNT判断是求和还是计数。
我比较疑惑的是对于省略参数EXCEL的默认值是什么的,我感觉在工作表函数中对完全省略参数,即也省略了逗号;有逗号但没有参数这两种形式的处理不一样,但VBA自定义函数的处理方式是一样,不知道您是如何理解的?
回复

使用道具 举报

发表于 2012-12-27 20:29 | 显示全部楼层
zhoucs00 发表于 2012-12-27 20:25
代码之前有判断是按背景色还是按字体颜色IF BackOrFont THEN ELSE来统计了的,就产生了两套SUM 与 I 。最 ...

把你的附件一起传上来吧,只 有代码,没办法测试,而且你的描述和你代码的思路有点区别,所以,,,,附件很重要
回复

使用道具 举报

发表于 2012-12-27 20:37 | 显示全部楼层
本帖最后由 suye1010 于 2012-12-27 20:44 编辑

=LEFT(A1,)这个函数第二个参数按照语法的要求,应该是指定一个数字.如果你不加逗号,函数帮助本身就说明了,只截取一个字符,也就是说相当于left(A1,1)。如果你添加了逗号,函数的语法默认就是你指定第二个参数(这个参数默认是数值),什么也不输,即使是逻辑值False, 他也会转换为数值0.

不管什么函数中判断你指不指定参数的 关键符号是 ,(逗号),另一个关键就是 参数的类型 (譬如数值型,逻辑型 Etc)

从这个角度去理解,你举的这两个例子并不冲突,它们都完全遵从了这一原则。
回复

使用道具 举报

 楼主| 发表于 2012-12-27 20:57 | 显示全部楼层
无聊的疯子 发表于 2012-12-27 20:29
把你的附件一起传上来吧,只 有代码,没办法测试,而且你的描述和你代码的思路有点区别,所以,,,,附件很重要

10temp.rar (14.25 KB, 下载次数: 7)
回复

使用道具 举报

 楼主| 发表于 2012-12-27 21:03 | 显示全部楼层
suye1010 发表于 2012-12-27 20:37
=LEFT(A1,)这个函数第二个参数按照语法的要求,应该是指定一个数字.如果你不加逗号,函数帮助本身就说明了, ...

您说的第二段话"不管什么函数中判断你指不指定参数的 关键符号是 ,(逗号),另一个关键就是 参数的类型 (譬如数值型,逻辑型 Etc)“我还是不是很理解。。
不知道这样理解对不?
=Color(E1,C2:C12)   '这里的话,由于缺省了后面两个参数(逗号也缺省了),所以就都按默认值FALSE来处理。
=Color(E1,C2:C12,,1) '这里的话,由于缺少了第三个参数。不过逗号还在,第三个参数是按0处理的。
由于FALSE就是0,所以说这里的处理方式是一样的。不知道可不可以这样理解?

点评

大体上是这个意思了!  发表于 2012-12-27 21:10
回复

使用道具 举报

发表于 2012-12-27 21:09 | 显示全部楼层    本楼为最佳答案   
zhoucs00 发表于 2012-12-27 21:03
您说的第二段话"不管什么函数中判断你指不指定参数的 关键符号是 ,(逗号),另一个关键就是 参数的类型 ...

你应该这么理解,因为你定义了第三个参数的数据类型为boolean(逻辑值),当你添加了,(逗号),就表示你需要指定这个参数的值,而你什么都不输入,其实是表示你输入的是0,而并不是让这个参数默认,之所以他的作用跟你默认的效果一样,是因为在VBA中,当参数类型为boolean时,如果你输入一个数值,等于0的就按照False来处理了而已。

回复

使用道具 举报

 楼主| 发表于 2012-12-27 21:13 | 显示全部楼层
suye1010 发表于 2012-12-27 21:09
你应该这么理解,因为你定义了第三个参数的数据类型为boolean(逻辑值),当你添加了,(逗号),就表示你 ...

嗯嗯,我懂了,其实与工作表中还是一样的。这个自定义函数中缺省参数的处理就像IF函数 =IF(A1>0,"是",)与=IF(A1>0,"是")这两种形式一样的。呵呵,非常感谢您!
回复

使用道具 举报

发表于 2012-12-27 21:37 | 显示全部楼层
学习了。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-17 03:23 , Processed in 0.305521 second(s), 14 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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