使用 ParamArray(相对于 Variant 数组)有什么好处?

2023-12-28

我用过ParamArray当我想接受可变数量的参数时,我声明了多年。 MinVal 函数就是一个很好的例子:

Function MinVal(ParamArray Values() As Variant)
    Dim ReturnVal As Variant, v As Variant

    If UBound(Values) < 0 Then
        ReturnVal = Null
    Else
        ReturnVal = Values(0)
        For Each v In Values
            If v < ReturnVal Then ReturnVal = v
        Next v
    End If
    MinVal = ReturnVal

End Function
' Debug.Print MinVal(10, 23, 4, 17)
' 4

可以在没有 ParamArray 的情况下将其重写为:

Function MinVal(Optional Values As Variant)
    Dim ReturnVal As Variant, v As Variant

    If IsMissing(Values) Or IsNull(Values) Then
        ReturnVal = Null
    Else
        ReturnVal = Values(0)
        For Each v In Values
            If v < ReturnVal Then ReturnVal = v
        Next v
    End If
    MinVal = ReturnVal

End Function
' Debug.Print MinVal(Array(10, 23, 4, 17))
' 4

请注意,在第二个示例中使用Array()调用 MinVal 中的函数。

第二种方法的优点是能够将参数数组传递给另一个也接受数组的函数。如果我希望能够将参数数组传递给MinVal到其他一些功能。

我开始想我应该always赞成这种方法并停止使用ParamArray共。

有人可能会争辩说,使用ParamArray使得代码更明确可读。但是,编译时检查没有任何优势,因为ParamArray must是一个变体数组。谁能提供一个令人信服的理由ever use ParamArray?


我的大部分ParamArray函数有 stdArray像这样完成繁重工作的版本:

Private Sub Command2_Click()
    Process 1, 2, 3
End Sub

Private Sub Process(ParamArray A() As Variant)
    ProcessArray CVar(A)
End Sub

Private Sub ProcessArray(B As Variant)
    Debug.Print UBound(B)
End Sub

但这对于输出参数不起作用,所以是的替换ParamArray with Array变得非常快,对于输出参数来说非常不方便。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 ParamArray(相对于 Variant 数组)有什么好处? 的相关文章

  • 如何从示例中给出的某些输入自动生成某些 Excel 字符串?

    基本上我想要在Excel中执行以下操作 如果我在表 1 中输入以下内容 我需要它 A B C 1 Name Size Color 2 Shirt S M L Red Green 3 Trouser 32 34 White Black Gre
  • 根据单元格值隐藏图表

    我是 Excel VBA 新手 我正在尝试用 VBA 代码解决这个问题 基本上 我的工作表有 12 个图表和 12 个表格 在任何给定时间 只有一个表会获取数据 并且只能看到该图 其他 11 个图表应隐藏 我试过这个 Sub getchar
  • 变量的变化触发事件

    是否可以通过变量的更改来触发事件 例如 这将触发事件 Dim t As Integer Dim Fire As Boolean Private Sub Test t 0 Fire True IIf Fire t 1 t 2 End sub
  • Outlook 宏中的 SenderName 为空

    我想要得到SenderName和和To属性来自于MailItem对象 但它们是空白的 我可以看到有SentOn Subject以及其他不为空的属性 有谁知道为什么这两个是空白的 这是我的代码 Sub TestMacro Dim myOlAp
  • 如何修复在 Excel VBA 中使用查找函数的错误

    我尝试从另一张表中搜索值 而不是使用 FIND 函数 Private Function Search rng As Range FindString As String As Range With rng Set Search Find w
  • 如何使用 xlwings 从 Python 调用 Excel 宏?

    我读过API docs http docs xlwings org api html对于 xlwings 并在解释器中使用 Workbook 和 Sheet 对象 但我不知道如何从 Python 调用宏 如何使用 xlwings 从 Pyt
  • 导出到 Excel 时如何避免“数字存储为文本”

    当我将表格从 Access 导出到 Excel 时 所有数字都显示为文本 并且单元格上有绿色箭头 有没有办法自动修复此错误 或者有另一种导出方法可以解决该错误 作为参考 这是我导出的方式 DoCmd TransferSpreadsheet
  • VBA 激活 Internet Explorer 窗口

    我正在制作一个宏 用于打开 Internet Explorer 导航并登录网站 一切正常 但我需要将 IE 窗口放在前面并激活它 这样我就可以使用SendKeys在上面 我发现网站和视频在名为的命令上有不同的方法AppActivate我已经
  • 如何让VLOOKUP在VBA中选择到最低行?

    希望自动在单元格中插入 VLOOKUP 公式 录制宏时 我指示它使用相同的公式填充下面的列 效果很好 但是 当 VLOOKUP 搜索的表发生变化 更多或更少的行 时 就会出现问题 在记录时 VLOOKUP 下降到表中的最后一行 273 但是
  • VBA 中的多线程

    这里有人知道如何让VBA运行多线程吗 我正在使用 Excel 无法用 VBA 本地完成 VBA 构建在单线程单元中 获得多个线程的唯一方法是使用 VBA 之外的其他具有 COM 接口的东西构建 DLL 并从 VBA 调用它 信息 OLE 线
  • VBA 完成 Internet 表单

    我正在寻找将 Excel 中的值放入网页的代码 Sub FillInternetForm Dim IE As Object Set IE CreateObject InternetExplorer Application IE naviga
  • 我可以获取VBA代码中的注释文本吗

    可以说我有以下内容 Public Sub Information TEST End Sub 有没有办法得到 TEST 结果 不知何故通过VBA 例如 在 PHP 中 有一个获取注释的好方法 这里有什么想法吗 编辑 应该有办法 因为像 MZ
  • 使用输入作为显示日期的基础

    我需要一种方法来使用用户窗体上的输入来确定将在输出上显示的日期 这是我的代码 If StatusBox Value lt 23 59 And ShiftCode Value AP Then Cells emptyRow 8 Value Da
  • 我如何以更好的方式编码而不是像这样的VBA编码

    我正在 Excel 中创建一个仪表板 但是我想知道是否有比这更好的编码方式 我想对其进行模块化 而不是这样做以使其更加整洁 Private Sub Afford If af Value True Then af afr Value Shee
  • 检查未绑定控件是否具有值的正确方法

    简单场景 一个表单和一个文本框 未绑定 Text1 If lt gt Text1 Then MsgBox Not Empty End If 上面的代码有效 表达方式 lt gt Text1如果文本框包含字符 则计算结果为 True 无论文本
  • SQL Excel VBA 运行时错误 3709 无效连接

    这是我的第一个问题 欢迎提出建设性的批评 我正在尝试从 Excel VBA 查询 Access 数据库并将返回信息放入 Excel 范围中 我收到此错误 错误消息 运行时错误 3709 连接无法用于 执行此操作 在此情况下它已关闭或无效 语
  • 如何使用 VBA 添加 MS Outlook 提醒事件处理程序

    我想扩展 MS Outlook 以便当弹出日历提醒时 我可以运行一个可以运行外部程序 如批处理脚本 的 VBA 挂钩 就我而言 我想将提醒 转发 到 Linux 桌面 因为我在这两种环境中工作 并且 Windows 桌面并不总是可见 我看到
  • 使用 ODBC 从位于 Program Files 文件夹中的数据库读取

    我们有一个应用程序 将其数据库文件存储在 Program Files 目录的子文件夹中 这些文件被重定向到 Vista 和 Windows 7 中的 VirtualStore 我们使用 Microsoft DataReports VB6 表
  • 分发用 VB6 开发的 Visio 插件

    我有旧的 VB6 Addin Visio 源代码 可以在编译时生成 DLL 我需要将此 dll 分发给最终用户 但是当我在用户的 PC 上以管理员身份运行以下命令时 regsvr32 MyAddin dll 它抛出 The Module M
  • 使用 split 函数到数组中会导致编译错误:无法分配给数组

    我正在尝试使用split 函数根据给定名称字符串中的空格拆分名称 当尝试编译我在下面编写的代码时 出现编译错误 无法分配给数组 我几乎从这里复制了微软的示例 https support microsoft com en us kb 2662

随机推荐