Excel:修复自身的自定义功能?

时间:2016-09-08 21:15:26

标签: excel vba function

长话短说,我试图让我的自定义函数增加公式条目(触发它的那个!)作为函数的一部分。这是一个提炼的例子:

Private Function heythere(blah As String)
    extraBit = "title"
    ActiveCell.Formula = Replace(ActiveCell.Formula, ")", "," & """" & extraBit & """" & ")")
End Function

基本上,extraBit由UserForm ListBox定义,如果用户没有将其添加到公式中。有许多选项,根据条目的第一个参数动态加载到ListBox中。解释起来有点棘手,但如果公式中提供extraBit则表示UserForm没有出现,结果是直接给出的。所以我想在定义extraBit之后“修复”条目。基本上,在上面的示例中,=heythere(a1)将变为=heythere(a1,"title")

这可能吗?我尝试创建一个单独的Private Sub来覆盖条目,但无济于事。提前感谢任何建议...

编辑:为了阐明它的工作方式,实际的UDF更像是这样,带有可选的辅助参数:

Private Function heythere2(blah As String, Optional extraBit As String)
    If extraBit = "" Then
        extraBit = "title"
        ActiveCell.Formula = Replace(ActiveCell.Formula, ")", "," & """" & extraBit & """" & ")")
    End If
End Function

1 个答案:

答案 0 :(得分:2)

问题是excel不知道你打算用公式做什么,返回值无效。这将显示您遇到错误。如果这是一个UDF,你进入一个无限循环,因为每次单元格更改它再次运行代码。重新思考你的方法。

Public Function heythere(blah As String, Optional extraBit As String = "")
    On Error Resume Next
    Dim formulaText As String
    formulaText = ActiveCell.Formula
    If extraBit = "" Then
        extraBit = "title"
    End If
    formulaText = Replace(formulaText, ")", "," & Chr(34) & extraBit & Chr(34) & ")")
    ActiveCell.Formula = formulaText

    If Err.Number <> 0 Then
        MsgBox Err.Description
    End If
End Function

因此,让我们更改您的公式位并使用工作表更改事件

'Lets set the text of the cell to the value of the extrabit
Public Function heythere(blah As String, Optional extraBit As String = "") As String
    If extraBit = "" Then
        extraBit = "title"
    End If
    heythere = extraBit
End Function

现在我们使用工作表更改的事件更新公式

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    If InStr(1, Target.Formula, ",") > 0 Then

    Else
        On Error Resume Next
        Dim formulaText As String
        formulaText = Target.Formula

        formulaText = Replace(formulaText, ")", "," & Chr(34) & Target.Value & Chr(34) & ")")
        Target.Formula = formulaText

        If Err.Number <> 0 Then
            MsgBox Err.Description
        End If
    End If
End Sub

Viola,公式更新了。 IMO这仍然是一个糟糕的方法,因为在你采取行动之前,你需要检查哪个公式在单元格中。