簡體   English   中英

Excel VBA:稱為公式的VBA函數運行方式不同嗎?

[英]Excel VBA: VBA Function Called as Formula Runs Differently?

這是我的宏

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)例如=AutoFormula(D7;G7)來調用,它將無法正常工作。 在Excell單元格中,我收到#ARG錯誤。 當我調試宏時,它會一直正常運行直到target.Cells(1, 1).FormulaLocal = ret行;當我跨過它時,它會立即中斷功能而不完成它。 有任何想法嗎?

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()將返回錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM