2012-10-30 84 views
1

我正在尝试编写一个Excel VBA函数,该函数将基于表单中其他位置的全局设置,返回两个输入参数之一作为输入单元格的公式。 IE,在表格中的其他地方设置A或B,那么调用函数AorB的公式将根据全局设置返回A或B.返回公式选择的Excel函数

事情是这样的:

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 

我凑很严重,但我就是没有什么类型的输入的知识,为了让函数返回返回。

任何帮助,将不胜感激。

+1

你不能以这种方式返回一个公式,只有一个值。该值可以根据您的设置以两种方式计算,但该函数只会返回一个值。 – nutsch

+0

除非你真的很时髦 - http://stackoverflow.com/questions/8520732/i-dont-want-my-excel-add-in-to-return-an-array-instead-i-need-a-udf改变 - 正如nutch所说,这只能返回一个值 – brettdj

回答

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 
+0

“你不能从UDF更改单元格公式” - 你可以。但它很复杂。看到我上面的链接 – brettdj

+0

我试图通过开发一个UDF来避免使用许多IF语句来降低工作表的复杂性。事实上,我已经有数百个以IF开头的单元格(somesetting = A .........并且想要简化并清理该过程。) 它可能比它更值得麻烦, – DPierce

+0

呃......我不确定你是否会考虑这个更简单,但是你可以修改UDF SomeSetting来通过传递一个变量来检索你所有的设置 –

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 

你可以使用数据验证(数据菜单下),以确保用户只能输入“A”或“B”,但使用的最后一个else子句如果你有一个选择的默认状态,那就没有必要了。

这实际上与仅仅命名全局单元格并在后面的公式中引用它并不不同,后者不需要VBA。我假设你的函数在后台稍微复杂一些,这需要一个UDF。如果没有,只需使用命名的范围。

我实际上建议你使用1或2而不是“A”或“B”,因为那时你可以在需要引用全局设置时使用CHOOSE函数,它的语法比使用IF功能。

+0

+1 ...'选择(TestCell,DoIf1,DoIf2)'确实使一些公式更具可读性 – SeanC