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

ilo*_*zen 2 excel vba excel-vba excel-formula

这是我的宏

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
Run Code Online (Sandbox Code Playgroud)

当我使用auto()子程序运行它时它工作正常并产生所需的结果.但是,如果我将它称为excell单元格中的公式,就像=AutoFormula(D7;G7)它不起作用.在Excell单元格中,我收到#ARG错误.当我调试宏时,它会正常运行直到target.Cells(1, 1).FormulaLocal = ret行,当我跳过它时会立即中断函数而不完成它.有任何想法吗?

Vit*_*ata 5

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

在您的情况下,您试图在Excel中更改范围参数的值,例如target是一个参数,并且target.Cells(1, 1).FormulaLocal = ret您要求Excel更改它.


换句话说,假设您希望A1通过UDF 加倍值.实现它的一种方法是通过这个:

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
Run Code Online (Sandbox Code Playgroud)

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


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

Public Function Put5InA1()
    Range("A1") = 5
End Function

Public Sub TestMe()
    Debug.Print Put5InA1
End Sub
Run Code Online (Sandbox Code Playgroud)

TestMe()将生成5in A1并且UDF =Put5InA1()将返回错误.