Excel VBA:称为公式的VBA函数运行不同?

这是我有的macros

Option Explicit Function AutoFormula(blocks As Range, target As Range) Dim blockedArr() As String Dim cellValue As String Dim ret As String Dim i As Integer 'sprawdzenie zakresu If (blocks.Cells.Count > 1) Then AutoFormula = "Tylko 1 komórka jako parametr!" Exit Function End If 'wczytanie komorki cellValue = blocks.Cells(1, 1).Value 'split blockedArr = Split(cellValue, ",") ret = "=WYSZUKAJ.PIONOWO(E7;$E$2:$G$5;3;FAŁSZ)" For i = LBound(blockedArr, 1) To UBound(blockedArr, 1) ret = ret + "+SUMA.JEŻELI(A7:A1000;" + blockedArr(i) + ";G7:G1000)" Next i target.Cells(1, 1).FormulaLocal = ret AutoFormula = 1 End Function Sub auto() Call AutoFormula(Worksheets("reorganizacja").Range("D7"), Worksheets("reorganizacja").Range("G7")) End Sub 

当我运行它使用auto()子它工作正常,并产生所需的结果。 但是,如果我把它称为excell单元格中的公式=AutoFormula(D7;G7)它不起作用。 在Excell单元格中,我收到了#ARG错误。 当我debuggingmacros时,它正常运行,直到target.Cells(1, 1).FormulaLocal = ret行,当我跨过它立即打破了function没有完成。 有任何想法吗?

UDF只能向调用它的单元格返回一个值 – 它不能修改任何单元格的内容或格式,也不能修改Excel的操作环境。 如果您尝试更改任何内容,则该函数将立即终止并向调用单元返回#VALUE错误。 来源 – Cpearson.com

在你的情况下,你正试图改变Excel的范围参数的值,例如target是一个参数,并通过target.Cells(1, 1).FormulaLocal = ret你问Excel的改变。


换句话说,假设你想通过一个UDF加倍A1的值。 实现它的一个方法是通过这个:

 Option Explicit Public Function DoubleArgument(a As Range) As Double a = a * 2 DoubleArgument = a End Function Public Sub TestMe() Debug.Print DoubleArgument(Range("A1")) End Sub 

但是,如上所述,您不能通过UDF更改Excel中的值,因此如果您在Excel中运行=DoubleArgument(A1)它将是一个错误。


如果要简化示例,请删除参数,请尝试以下操作:

 Public Function Put5InA1() Range("A1") = 5 End Function Public Sub TestMe() Debug.Print Put5InA1 End Sub 

TestMe()将在A1生成5 ,而UDF =Put5InA1()将返回一个错误。