【问题标题】:Calling an Access VBA function with IF statement as an argument使用 IF 语句作为参数调用 Access VBA 函数
【发布时间】:2020-05-04 16:34:29
【问题描述】:

假设我有以下 MS Access 2016 功能:

Public Function TestFunction(ByVal strTest As String) As String

有没有办法用类似的方式调用函数:

strReturn = TestFunction(If a = 1 Then "Apple" Else "Orange")

我想写一些尽可能紧凑的东西,避免为调用写多行,例如:

If a = 1 Then strArg = "Apple" Else strArg = Orange
strReturn = TestFunction(strArg)

【问题讨论】:

  • 考虑不要做一些时髦的事情来节省一行代码。只需采用明显的、冗长的解决方案,就可以避免任何人试图弄清楚你在做什么,以及为什么你在未来会遇到很多麻烦。除非你有一个真正冗长的列表,在这种情况下你可能想要完全不同的东西,比如在表格中查找它的函数(不混合代码和数据是一个好习惯),或者数组/集合/字典。

标签: vba ms-access ms-access-2016


【解决方案1】:

您可以使用IIf 完成此操作,例如:

strReturn = TestFunction(IIf(a=1,"Apple","Orange"))

但在使用常量以外的表达式时通常不鼓励这样做,因为IIf 将始终评估 both thenelse 参数,然后根据结果返回适当的值测试表达式,有时会导致不希望的结果。

例如,在即时窗口中计算以下表达式 (Ctrl+G) 将导致除以零错误,即使 else 表达式将永远不会被退回:

?iif(true,"Apple",1/0)

【讨论】:

  • 除了你提到的关于评估这两个语句的注释之外,为什么强烈反对 IIf
  • 如果有IfElse If 的场景呢,类似于Select Case 语句,其中只有两个可能的值,即If a = 1 Then "Apple" Else If a = 2 "Orange"
  • @ScottHoltzman 出于这个原因 - 除非小心使用,否则它可能会导致不良副作用 - 我想 strongly 有点强,我会删除它。
  • @MiniG34 您可以使用嵌套的IIf 表达式。
  • IIf 并不比 VBA 中的任何其他函数调用更特别:它的参数在函数调用之前被评估,因此它们的评估结果可以作为参数传递给函数,然后在给定布尔第一个参数的情况下决定输出哪个。非常不鼓励的是,除了为参数传递常量表达式之外的任何东西。传递字符串文字绝对没有错。传递副作用函数调用时的不同情况。
【解决方案2】:

如果 a 的值来自明确定义的范围,那么解决方案是使用 Choose 函数用于连续范围或使用 Switch 函数用于非连续明确定义的范围。

当然,更成熟的解决方案是将选择或切换都替换为字典。

【讨论】:

    【解决方案3】:

    为什么不用这样的方式来实现多种可能性

    Dim myArg as String
    
    Select Case a
        Case 1: myArg = "Apple"
        Case 2: myArg = "Orange"
        Case 3: myArg = "Pear"
       'etc.
    End Select
    
    strReturn = TestFunction(myArg)
    

    【讨论】:

    • 我的目标是写出尽可能紧凑的东西。当然,这会起作用,但是由于我已经使用不同的条件语句作为参数调用了 50 多次相同的函数,我想避免每次都编写不同的 Select Case 并尝试将所有内容保持为一行。
    • 50+ times with different conditional statements as arguments 似乎并不简单。除非你只有 1 或 2 个条件句,否则很难写在一行上。另一个选项是创建一个单独的函数来计算条件参数,然后将其传递给函数。这样你只调用返回条件和 testFunction 的函数。您也可以使用模块级别或全局变量来提供帮助。
    • 是的,我只是想写一个函数 :) 我认为这可能会解决“紧凑性”问题。
    • @MiniG34 - 我一直这样做
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多