ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] 关于自定义函数的使用理解及函数集锦

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2016-5-24 12:49 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 opiona 于 2016-5-24 16:18 编辑

欢迎大家将常用的自定义函数放上来
或者需要什么样子的函数,发上来

'函数在EXCEL公式,VBA,包括其他变成语言都是重要组成部分
'工作表内的公式,大家都会用,其实自定义函数和它是一样的
'就是自己写一个函数,输入几个参数,返回需要的值,来实现特定的功能。
'函数和过程的区别:函数能返回值,过程不能,过程就像阉割版的函数
'
'自定义函数的好处:
'1、将复杂的问题简单化,碰到相同的,或类似的问题,修改参数就OK了
'2、可以重复使用,不用每用一次都写大段的代码,直接一句函数和参数就可以了
'3、需要修改时,只修改函数内的代码即可,不用再每一个使用的地方都修改
'4、自定义函数可以在工作表中像自带公式一样使用,也可以在窗体过程中调用

'//建议:将经常用到的固定代码,写成自定义函数,这样会简化代码,加快开发速度

'先来一个数字大写的例子:
'工作表公式:B1=SUBSTITUTE(SUBSTITUTE(TEXT(TRUNC(FIXED(A1)),"[dbnum2]G/通用格式元;负[dbnum2]G/通用格式元;"&IF(A1>-0.5%,,"负"))&TEXT(RIGHT(FIXED(A1),2),"[dbnum2]0角0分;;"&IF(ABS(A1)>1%,"整",)),"零角",IF(ABS(A1)<1,,"零")),"零分","整")
'在工作表中使用: B1 = DX(A1)  '//如果一百个地方写这个公式,这样就简单许多
'在VBA代码中调用:msgbox DX(123.06)
'在窗体过程调用:textbox1.text=DX(123.06)  或者:textbox1.text=DX(textbox2.text)
'自定义函数如下:写在某一个模块中


  1. '********函数名: DX      是函数名
  2. '********返回值:         String类型
  3. '********参数名: M       double类型

  4. Public Function DX(ByVal M As Double) As String
  5.     Dim TEMP As String   '//最好每个变量都先声明,以免在要求声明的代码中出错
  6.     If Abs(M) < 0.005 Then  '//函数代码正文
  7.         TEMP = ""
  8.     Else
  9.         TEMP = Replace(Replace(Replace(Join(Application.Text(Split(Format(M, " 0. 00")), Split("@ [DBNum2];;0 [>9][dbnum2]圆0角0分;[=0]圆整;[dbnum2]圆零0分")), ""), "零分", "整"), "0圆零", ""), "0圆", "")
  10.     End If
  11.     DX = TEMP   '//指定函数返回值
  12. End Function
复制代码


评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-5-24 12:55 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
'自定义函数之我的理解,大侠请忽略:

'在函数名前的修饰符:[Public | Private | Friend] [Static]
            '[Public]  表示所有模块的所有其它过程都可访问这个 Function 过程,包括工作表公式,模块,窗体过程。如果省略,则默认为:[Public]
            '[Private] 只有包含其声明的模块的其它过程可以访问该 Function 过程
            '[Friend]  可选的。只能在类模块中使用,使用前要先声明,类模块的使用一般都是大侠们使用
            '            Dim goldFish As Class1  '//Class1 是类模块的名称
            '            Set goldFish = New Class1
            '            MsgBox goldFish.DX(123.06)
'函数名称:name    和其他过程命名相似,不要和公式,系统函数重名即可,主要是自己能看明白是啥
        '
'函数参数:arglist:[Optional] [ByVal | ByRef] [ParamArray] varname[( )] [As type] [= defaultvalue]
            '参数组成:修饰符+空格+变量名+空格+AS+空格+类型,函数可以没有参数,表示变量的参数名称,例如:M  遵循标准的变量命名约定
            '[AS ]       AS 后面是参数的类型,例如:Byte、Boolean、Integer、Long、Currency、Single、Double、object
            '[ByVal]     ByVal M As Double   可选的,ByVal:表示该参数按值传递,ByRef:我用的较少。
            '            ByVal RNG As RANGE  讲一个单元格作为参数
            '            ByVal ARR() As Doubl  这是将一个数组当做参数使用
            '[Optional]   Optional ByVal FileFilter As String = "*.*"   表示此参数可有,可无,一般指定了默认值,没有,就是使用默认值:"*.*"
                         '注意:如果有:[Optional],则后面的参数必须全是:[Optional],或者说:[Optional] 只能放在[ByVal | ByRef]之后
            '[ParamArray] 可变参数在最后,是一个数组,里面有多个参数,用的比较少。
        
'函数正文:[statements]     函数内的代码

'退出函数:[Exit Function]  在函数过程中,如果需要可在需要位置,直接退出函数,推出前最好指定返回值

'返回值 : [As type]    AS STRING 返回字符串,As String()  返回一个字符串数组
'          [name = expression] 函数中要指定函数的返回值,要和开始声明返回值类型相同

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-5-24 12:56 | 显示全部楼层
本帖最后由 opiona 于 2016-5-24 13:06 编辑

'为了使自定义函数用起来更像自带公式,要登记函数,就是运行下面的过程:RegUDF
'就可在工作表公式--选择类别--选择公式:看到此自定义函数:DX

  1. Sub RegUDF() '此过程用户注册自定义函数,保存为宏前,运行这个宏,名字可随便

  2.     Dim FuncName As Variant       '函数名称
  3.     Dim FuncDesc As Variant       '函数描述
  4.     Dim Category As Variant       '函数类别
  5.    
  6.     FuncName = "DX"   '//要登记的函数名称
  7.    
  8.     FuncDesc = "数字汉语大写函数"  '//函数描述:描述不能太长
  9.     FuncDesc = FuncDesc + Chr(13) + ""
  10.     FuncDesc = FuncDesc + Chr(13) + "北极狐工作室 QQ:14885553"
  11.     FuncDesc = FuncDesc + Chr(13) + ""
  12.     FuncDesc = FuncDesc + Chr(13) + " M -- 是一个数字,Double类型"
  13.    
  14.     Category = 1  '//财务,其他类别,在帮助中搜索:Application.MacroOptions
  15.     Call Application.MacroOptions(Macro:=FuncName, Description:=FuncDesc, Category:=Category)  '//将设置信息添加到:工作表公式中

  16. End Sub
复制代码
1.jpg
2.jpg

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-5-24 12:58 | 显示全部楼层
本帖最后由 opiona 于 2016-5-24 13:03 编辑

实例文件: 关于自定义函数.rar (25.87 KB, 下载次数: 400)

内附函数:查找指定文件夹含子文件夹内所有文件名或文件夹名(含路径)

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-5-24 12:59 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
个人所得税计算2014-带帮助
个人所得税计算2014-带帮助.rar (36.71 KB, 下载次数: 219)

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-5-24 13:00 | 显示全部楼层
本帖最后由 opiona 于 2016-5-24 16:28 编辑

自定义函数之:递归

大家都知道:函数是可以嵌套的,如果函数中嵌套的是函数本身,就是递归
下面是一个简单例子:
  1. Public Function JISUAN(ByVal M As Double) As Double
  2. Dim JG As Double
  3. JG = 30
  4. JG = JG + M
  5. If JG < 100 Then '//符合一个条件,就继续计算,哪位说的:万恶的递归开始了
  6. JG = JISUAN(JG) '//函数调用函数本身
  7. End If
  8. JISUAN = JG
  9. End Function
复制代码
自定义函数递归.rar (7.25 KB, 下载次数: 185)


TA的精华主题

TA的得分主题

 楼主| 发表于 2016-5-24 13:04 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2016-5-24 13:36 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2016-5-24 14:39 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
北极狐,自定义函数 登记

TA的精华主题

TA的得分主题

发表于 2016-5-24 15:06 | 显示全部楼层
opiona 发表于 2016-5-24 12:58
实例文件:

内附函数:查找指定文件夹含子文件夹内所有文件名或文件夹名(含路径)

你好,下载后没看到“查找指定文件夹含子文件夹内所有文件名或文件夹名(含路径)”的代码
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-4-19 17:36 , Processed in 0.047433 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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