1

我正在尝试编写一个 Excel VBA 函数,该函数将根据工作表中其他位置的全局设置返回两个输入参数之一作为它输入的单元格的公式。IE,在工作表的其他地方有人设置了 A 或 B,然后调用函数 AorB 的公式将根据全局设置返回 A 或 B。

像这样的东西:

Function AOrB(A As Variant, B As Variant) As Variant
    If someSetting = A Then
        AOrB.formula = A
    ElseIf someSetting = B Then
        AOrB.formula = B
    End If
End Function

我已经大量搜索,但我只是不知道输入和返回什么类型以允许函数返回。

任何帮助,将不胜感激。

4

2 回答 2

2

从 UDF 更改公式不是一个好主意。这是可能的,但很复杂。

我相信执行您所解释的正确方法是通过公式中的 IF :

=IF(someSetting = A, AFormula, If(someSetting = B,BFormula,""))

如果someSetting是您在代码中存储的内容,您可以创建一个 UDF 来检索该值。像这样:

Private mySetting As Variant
Function SomeSetting() As Variant
    SomeSetting = mySetting
End Function
于 2012-10-30T22:26:38.827 回答
1

为将保存全局设置的单元格命名,例如“ABChoice”。(您可以通过单击显示当前单元格位置的编辑栏左侧并输入所需名称来执行此操作)。

然后重写公式:

Function AOrB()
    If ThisWorkbook.Range("ABChoice") = "A" Then
        AOrB = "A"
    ElseIf ThisWorkbook.Range("ABChoice") = "B" Then
        AOrB = "B"
    Else
        AOrB = "A" 'could switch to B, whichever is the default
    End If
End Function

您可以使用 Data Validation(在 Data 菜单下)来确保用户只能输入“A”或“B”,但使用最后的 Else 子句就没有必要了,假设您选择了默认状态。

这实际上与仅命名全局单元格并在以后的公式中引用它没有什么不同,这不需要 VBA。我假设您的功能在幕后有点复杂,这需要 UDF。如果没有,只需使用命名范围。

我实际上建议您使用 1 或 2 而不是“A”或“B”,因为当您需要引用全局设置时,您可以使用 CHOOSE 函数,它的语法比必须使用 IF 函数更简单。

于 2012-10-30T22:28:57.170 回答