目录

使用ParamArray关键字声明数组参数

IsMissing函数

IsArray函数

函数的嵌套与递归


​​​​​​​

在VBA编程过程中,经常会使用工作表函数Min来确立某组数中的最小值。但是工作表函数Min无法适用于二维以上的数组,也无法适用于某一维的大小超过65536的数组。

编写含有两个参数的自定义函数,第1个参数为变体类型,第2个参数为ParamArray关键字所指定的不确定数量的参数数组。假设第1个参数所代表的数值为最小值,然后遍历第2
个参数所表示的数组中所有的元素,包括作为元素的数组中的元素,当找到比最小值小的数字,则选取该数为最小值。

Option Explicit
Sub GetMin()Dim arr()arr = Range("A2:A1000000").Value'下面的语句会出错'debug.print worksheetfunction.min(range("A2:A100000").value)Debug.Print My_Min(arr(1, 1), arr)
End SubFunction My_Min(number1 As Variant, ParamArray numbers()) As VariantDim MinNum As VariantDim num1 As VariantDim num2 As Variant'假设number1最小MinNum = number1'若省略第2个参数If IsMissing(numbers) ThenMy_Min = MinNumExit FunctionEnd If'遍历行For Each num1 In numbers'若行>1If IsArray(num1) Then'遍历列For Each num2 In num1If num2 < MinNum Then My_Min = num2Next num2ElseIf num1 < MinNum Then My_Min = num1End IfNext num1My_Min = MinNumEnd Function

使用ParamArray关键字声明数组参数

当使用ParamArray关键字标注某个数组参数时,调用该函数时,可以使用逗号隔开各个参数,从该参数位置起,之后的参数输入将以一个以0为下限的一维数组传递给该程序。而且以ParamArray关键字标记的参数始终是以数组形式传递,即使该参数传递的元素个数为1。因而以ParamArray标记的参数可以作为一个一维数组处理。
    当调用含有ParamArray关键字所指定的参数时,该参数可以省略,也可以是数组。作为函数时,必须能够处理这些数据。

IsMissing函数

IsMissing函数用来判断自定义函数或过程中的参数在调用时是否被省略。当该参数省略时,函数返回True,反之返回False。IsMissing函数的语法如下:

IsMissing(arcgname)

参数argname为某个参数的名称。
    当需要使用IsMissing函数判断某个参数是否省略时,则在声明自定义函数或过程时,必须满足以下两个条件。

  • 该参数以Optional关键字或ParamArray关键字标记。
  • 该参数的数据类型是Variant类型。

本例中,由于参数Numbers是可省略的参数,因而需要使用IsMissing函数判断其是否省略,以避免发生错误。

IsArray函数

IsArray函数可以用来判断某个变量是否为数组。当该变量为数组时,函数返回True,反之返回False。其语法为:

IsArray(varname)

参数varname为变量名。
    本例中,numbers参数为一个一维数组,其所含的元素可以为值,也可以为另一个数组。因而,当循环遍历numbers数组中的各个元素时,首先应判断其是否为数组。当元素是数组时,则必须对该元素再次进行遍历。本例中由于无法得知数组的维数,因而一般采用For Each---Next循环进行遍历。
知识扩展

函数的嵌套与递归

本例中,为了遍历所有参数中的数字,需要对数组中的元素进行判断,当其为数组时,需要遍历数组中的元素,而当内层数组中的元素再次为数组时,则又需要对该数组进行遍历循环。
当数组数量不确定时,则无法确定需要多少次循环的嵌套。此类情形可以使用函数的嵌套,下面将本例更改为以下代码:

Option Explicit
Sub GetMin()Dim arr()arr = Range("A1:A1000000").ValueDebug.Print MyMin2(arr)
End Sub'递归方法获取最小值的自定义函数
Function MyMin2(ParamArray Numbers()) As Variant'变量声明Dim MinNum      As Variant   '最小值Dim Number1     As Variant   'Numbers数组的第一个元素Dim Num1        As Variant   '数组中的元素Dim Num2        As Variant   '数组中的元素'获取Numbers数组中的元素Number1 = Numbers(0)'若该元素是数组If IsArray(Number1) Then'找到数组中的第一个元素For Each Num1 In Number1'使用MyMin2函数获取该元素的最小值作为当前所有元素的最小值MinNum = MyMin2(Num1)Exit ForNextElse'假设第一个元素为最小值MinNum = Number1End If'遍历数组中的所有元素,获取最小值For Each Num1 In Numbers'若元素是数组,则遍历数组中的元素'使用MyMin2获取MinNum与数组的最小值If IsArray(Num1) ThenFor Each Num2 In Num1MinNum = MyMin2(MinNum, Num2)NextElse'若不是数组,则直接比较,获取较小值If Num1 < MinNum Then MinNum = Num1End IfNext'结果返回MyMin2 = MinNum
End Function

以上代码使用了函数的嵌套,在该函数内再次调用其函数本身,一旦遇到某个元素为数组的情况,则利用该函数再次计算其数组中的最小值。当数组中的元素为数组时,则会使该函数
循环调用,这种在函数中又调用函数的情况称为递归。递归同样也适用于自定义过程。递归过程与事件的循环触发非常类似。
    当需要在Excel VBA中使用递归过程时,必须注意以下几点。

  • 有明确的结束条件。若没有结束条件,则递归会无止境地运行下去。
  • 结束条件最终必须会被执行。如定义了某个递归的结束条件变量i为1时结束,而在实际过程中,i起始值为2,并且i每次不断增加,此时由于i永远不会等于1,则程序将会不断地执行下去。
  • 递归层数不宜过多。每次递归都会使用堆栈存储现在正在运行的程序,一旦递归层数过多,则会导致堆栈溢出错误。

Excel 2010 VBA 入门 110 获取最小值的自定义函数相关推荐

  1. Excel 2010 VBA 入门 037 获取最后一行数据的行数

    目录 示例: 实现代码1 使用Find方法查找最后的单元格 Find方法按行查找和按列查找的区别 实现代码2 获取工作表总行数 实现代码3 单元格对象的End属性 End属性的局限性 其他获取最后数据 ...

  2. Excel 2010 VBA 入门 014 获取VBA帮助

    通过录制宏可以得到许多代码,可是看不懂代码,只需要将光标定位在需要帮助的地方,按[F1]键即可打开相应的帮助文件.以获取函数Msgbox帮助时,操作步骤如下. 步骤1   按组合键[Alt+F11]打 ...

  3. Excel 2010 VBA 入门 056 获取当前Windows登录用户名(Environ)

    目录 示例 Environ函数 获取所有的系统环境变量 示例 在许多时候,开发者希望能够获取当前Windows登录用户的信息,并以此信息决定用户的使用权限等.如何使用VBA获取Windows登录用户名 ...

  4. Excel 2010 VBA 入门 051 获取和设置计算机中的当前日期

    示例 Option ExplicitSub 获取设置日期()Dim dDate1 As DateDim dDate2 As Date'获取日期dDate1 = DateDebug.Print &quo ...

  5. Excel 2010 VBA 入门 034 创建图片批注

    目录 批注(Comment)对象 批注的添加与删除 FiIIFormat对象 OnError语句 示例: 批注(Comment)对象 Comment对象是单元格的一个属性,表示单元格的批注.Comme ...

  6. Excel 2010 VBA 入门 001显示开发工具选项卡

    目录 VBA简介 宏简介 显示"开发工具"选项卡 ​ VBA简介 Visual Basic for Application (VBA)是Visual Basic的一种宏语言,是依附 ...

  7. Excel 2010 VBA 入门 006 设置宏安全性

    目录 操作方法 步骤1单击"开发工具"选项卡中的"宏安全性"按钮,如图所示. ​ 步骤2在"信任中心"的"宏设置"选项中 ...

  8. Excel 2010 VBA 入门 044 用VBA进行四舍五入

    目录 示例 实现代码 VBA的Round函数 VBA的Round函数与工作表Round函数的区别 在Office软件中使用自定义函数替代VBA的Round函数 示例 在实际工作中,经常需要对数据进行四 ...

  9. Excel 2010 VBA 入门 119 创建对话框的帮助文档

    目录 例 码 步骤1 ​ 步骤2 步骤3 步骤4 步骤5 步骤6 步骤7 步骤8 步骤9 步骤10 步骤11 步骤12 步骤13 步骤14 步骤15 CHM文件及HTML Help Workshop ...

最新文章

  1. 微信小程序客服功能 把当前页面的信息卡片发送给客服
  2. 洛谷 P1462 通往奥格瑞玛的道路 Label: 最小化最大值 spfa (存多条边示例)
  3. zookeeper的设计猜想-数据同步
  4. [IOS地图开发系类]2、位置解码CLGeocoder
  5. java spring包_java 自定义加载器,加载spring包,动态加载实现,jar包隔离,tomcat加载webapp方式...
  6. mysql5.7空间运算_msyql5.7数据类型和运算符
  7. Springboot 关于日期时间格式化处理方式总结
  8. KNN分类python实现
  9. python 反爬策略_如何应对网站反爬虫策略?如何高效地爬大量数据?
  10. 计算机组成原理笔记(王道考研) 第三章:存储系统
  11. 中国熊果苷市场运营效益及投资盈利预测报告(新版)2022-2027年
  12. 一、Filter的配置项dispatcher
  13. 麦克风测试软件 ios,iOS开发麦克风权限判断
  14. 元宇宙都市传说02:《头号玩家》的隐喻
  15. 基于FPGA的深度卷积神经网络的加速器设计
  16. [云原生专题-16]:容器 - 在Windows主机上搭建Docker环境
  17. Qt图表绘制(QtCharts)-绘制简单的盒须图[箱形图](12)
  18. 1. 什么是元组(tuple).md day07
  19. 百度SRE工程师提前批一面总结+为二面攒人品
  20. mac时间机器删除旧备份

热门文章

  1. iverilog -- ivlpp 词法与语法分析解读
  2. 金融科技大数据产品推荐:金融魔方 ---专业的金融SaaS服务平台
  3. 了解return的用法
  4. 前端工程师必备的几个实用网站
  5. python : pandas 中多重索引multiindex与多个标的dataframe
  6. C语言中的函数与数组详解
  7. 短视频怎么获得高流量?简单小技巧,让你的短视频被更多人看到
  8. HtmlEditor在线编辑器V3.0提供
  9. CSP-J 2021_3_网络连接
  10. 计算机电源寿命,影响电脑寿命的几个重要方面