Excel/OOCalc 中的替代 If() 函数

Excel/OOCalc 中的替代 If() 函数

多年来,我无数次想在 Excel/OpenOffice Calc 中使用如下形式的 If 语句:

If(A (comparison operator) B, A, C)

或者同样有用:

If(A (comparison operator) B, C, A)

其中 A 是一个非常冗长而复杂的表达式,而 B 和 C 简短而简单,通常(但并非总是)只是一个文字值。我想要一种方法来实现其中一个,它不涉及重复的 A 表达式(这至少是丑陋的两倍,需要重复编辑,并引入完全不必要的错误,这些错误甚至不会始终出现),或者给 A 一个专用单元格,或者使用 VBA(这是 Microsoft 专有的,因此很恶心,不在 Calc 中)。

对于特殊情况,有一些解决方法,例如 Excel 中的 Iferr()(Calc 中没有),以及使用“条件”类型函数(如 Abs()、rounding 和 Mod())来处理数字。但这些在大多数情况下不足以满足我的需要(而且数字操作也不够优雅和清晰)。有没有可能我遗漏了一个函数或一系列简单的函数可以做到这一点?这似乎是一件大事。

答案1

对于 LO Calc 解决方案,我看到两种方法:

  1. 将产生结果的函数A放入单独的受保护工作表。这样,用户不太可能意外尝试编辑包含您的函数的单元格。它还有其他一些优点:

    • 无需宏编码,
    • 可以将“功能”表复制到其他ods文件中,
    • 容易编辑。
  2. 定义函数为用户定义函数在基本宏内。LO Calc 使用的 Star Basic 与 VBA 不同,但非常相似,因为它们都是 Basic 方言。优点:

    • 充分发挥 starbasic 语言的威力,
    • 将其导出为“系统库”
    • 或嵌入到ods模板中。

在 Calc 中创建用户定义函数非常简单。假设您需要A通过将三个不同的值相乘来计算值,您只需创建一个这样的宏:

Function A(b, c, d)
A = b*c*d
End Function

现在,您可以在If表达式中使用该函数:

If(A(4, 5, 6) > B, A(4, 5, 6), C)

当然,这个简单的例子没有多大意义,但如果要计算的代码A()更复杂,它会更有用。如果要乘的三个值是固定的,你可以将代码简化为

Function A()
A = 4*5*6
End Function

并使用

If(A() > B, A(), C)

我知道这些例子太简单了,不足以说明解决方案。只需考虑在宏中添加常量定义或创建完整的函数库,也许还可以使用只编辑工作表的用户不可见的“私有”辅助函数ods

答案2

用户 tohuwawohu 发布了一条答案,直接引导我找到了自己的答案。我觉得 tohuwawohu 并没有完全理解我想要什么,也许是我的错,但他的宏建议帮助我理解了。我刚刚创建了一个宏,现在它已加载到所有工作表中,并且定义了一个函数,我可以使用与内置函数相同的语法来调用它。

但是,首先我使用的是 OpenOffice Calc,而不是 LibreOffice Calc,但它们都使用与 VBA(Microsoft 的 Visual Basic for Applications,用于 Excel)非常相似的 BASIC 语言。

您可以通过 Sub(如子程序)和 Function 定义语句块。根据文档中的此页面,加载/运行带有函数的宏就可以做到这一点,让您在普通单元格公式中将其作为函数调用。尽管过去尝试过找到一种方法来做到这一点,但我以前并不知道这一点。

浏览后OOCalc 基本概述有一段时间,我创建了一个可以工作的函数,尽管它并不像我想要的那样,因为运算符和第二个操作数作为两个单独的参数传递,而前者作为字符串传递。但是,我记得曾经至少有一个 Excel 内置函数使用相同的方法,即将运算符的参数作为字符串传递,所以至少有先例。

我想,问题在于我不知道创建“宏”是如此简单,它不是执行一些代码然后离开,而是定义一个可以在单元格公式中调用的函数。“宏”这个词有点让我困惑,因为它通常只意味着程序类型的东西,而且“用户手册”中有关于在宏中调用这些函数的信息,它位于网站与基本概述不同的部分。

工具 > 宏 > 组织宏 > OpenOffice Basic > “组织器...”按钮 > 库选项卡 > 我的宏和对话框 > “标准”库 > 编辑按钮

我将其粘贴在最后,保存并关闭编辑器。它执行原始问题中的两个函数中的第二个,但形式为 IfAlt(A, operator, B, C),其中 operator 是比较运算符的字符串。如果 A op B 为真,则返回 C,否则返回 A。

Function IfAlt(arg1, op, arg2, ifTrue)
    If (op="=" AND arg1=arg2) OR (op="<>" AND arg1<>arg2) OR _
        (op=">" AND arg1>arg2) OR (op=">=" AND arg1>=arg2) OR _
        (op="<" AND arg1<arg2) OR (op="<=" AND arg1<=arg2) Then
        IfAlt = ifTrue
    Else
        IfAlt = arg1
    End If
End Function

答案3

我认为您可以做到这一点,但我将尝试看看这是否是您的意思。因此,我将使用 Excel 作为示例,因为我有它,但对 OpenOffice Calc 不太熟悉。

在 Excel 中,我知道您会使用=if(condition, if true, if false)if 函数,如果我理解正确的话,您只是想将其合并为一个更小的函数,以便于阅读,对吗?

唯一的方法是为每个变量使用一个单元格,因为 Excel 的工作方式是,没有办法不使用单元格来声明变量。您可以使用 VBA,但正如您所提到的,您不能在 openoffice 中使用它。问题是您必须能够将公式/值/等存储在某个地方,这就是为什么它必须是一个单元格。

我不知道你的情况,但你必须保护工作表并锁定字段,将其标记为隐藏,或者不管它们并希望获得最好的结果。

相关内容