自定义用户功能,无需使用VBA


10

是否可以在不使用VBA的情况下在Excel中创建自定义用户功能?
我的问题是我串了很多标准的excel函数,使它们成为一个很长的函数。此功能在我的工作簿中的25个不同的工作表中使用。如果需要进行更改,我只想在一个地方进行更改,并使更改自动传播到所有工作表中。

例如,一个简单而琐碎的情况就是将一个添加到SUM()的结果中,即。SUM(mySeries)+1,并将其称为新函数MYSUM()。

由于可能出现的潜在错误和增加的复杂性,我不愿意将长公式转换为VBA。


很好的问题,尽管我怀疑您会找到答案。我认为更好的方法是寻求帮助,以在VBA中构建所需的功能。
EliadTech'Apr 17'14

Answers:


11

是的,如果您使用Excel命名公式,则可能。

例如,假设您需要计算工作簿中不同位置的两个连续列(A5:Ax-B5:Bx)之和之间的差(x是每列的最后一行):

因此,在A11中定义一个名为diff(可以使用任何名称)的名称为= Sum(A $ 5:A10)-Sum(B $ 5:B10),假设数据从第5行开始直到上一行。它可以是任何单元格,不仅是A11,而且定义以相同的方式更改。

不幸的是,Excel 2010插入了绝对前缀($)和工作表前缀,因此您需要删除前缀,但要保留感叹号并删除大多数$字符。

移动公式时,大多数参考是相对的。因此,它总是从第5行一直到总行之前的行,计算当前列与下一列之间的差。

因此,如果您在C5D100之间有数据,则只需在C101中放入= Diff即可计算出Sum(C5:C100)-Sum(D5:D100)

显然,您可以在命名公式中使用本地或全局名称,就像您在问题中提到的那样。

您可以在“ 命名公式”中阅读更多详细信息。


2

我知道您说过没有VBA,但是执行以下操作并不需要您实际上重新编写公式,对VBA有所了解,也不需要在VBA中维护您的公式。您只需编写一次,然后就可以忘记它。

创建一个用户定义函数以从单元格中提取公式作为字符串:

Function GetFormula(Target As Range) As String
    GetFormula = Target.Formula
End Function

创建另一个以评估类似于公式的字符串:

Function Eval(Ref As String)
    Application.Volatile
    Eval = Evaluate(Ref)
End Function

如果您在sheet1!a1中拥有主公式,则可以将其放在需要使用它的每个单元格中:

=eval(getformula(sheet1!a1))

与Excel命名公式相比,使用此方法有什么优势?
DakotaD

这实际上定义了一个函数,而“命名公式”仅定义了对结果的引用。例如,如果我想创建一个函数来检查一个单元格是空白还是空白,我想将其命名为=IF(BlankOrWhitespace(A5),true,false)。对于命名公式,这是不可能的,因为您正在引用单元格的公式内容且未定义新功能
mtalexan

1
使用VBA还会引起另一个问题。安全。您的工作簿将被迫不安全,因为VBA可能会被滥用。您的工作簿将被误认为是病毒。
Akangka

我避免使用VBA的@Akangkathe原因。真伤心
Pedro77 '19

0

这个线程有点旧,但是我偶然发现了它,寻找其他东西,并认为我会分享一本我创建的工作簿,试图完成这件事:https : //www.dropbox.com/s/gf5qrjj5q81tpke/ Title_Case_Named_Range_Function.xlsx?dl = 1

简而言之,您可以通过劫持Excel的内置公式之一(长度为0的字符串)并提出一种通过“命名范围”字符串操作来解释插入数据的方法来创建不带VBA(某种)的UDF。这样做效率低下。您已经被警告!:)

方法:

  1. 在示例中,我将= REPT([单元格引用或引号之间的某些文本],0)= TEXT([单元格引用或引号之间的某些文本],“ ;;;”)都用作起点可以将某种形式的用户输入到内置公式中,该公式不会在单元格本身中产生任何可见的文本。

  2. 然后,我创建了一个与您的UDF名称等效的命名范围TCase是工作表中的主要示例,但其中还存在其他几种变体)。这个“ 命名范围”实际上引用了工作簿中的其他所有隐藏名称,以从其使用的单元格中提取FormulaText,然后对其应用一些逻辑以生成最终的输出作为字符串。值得注意的是,此方法只能返回文本结果,而不能返回数字(尽管它可以返回数字作为要在单独的单元格中转换的文本)。

  3. 由于没有可解释的单元格/字符串引用,= TCase本身会产生错误(在示例工作表中,错误消息只是对需要遵循的格式的提示)。但是,将TCase与预期的长度为0的字符串Excel公式结合使用时,它可以将公式中的输入作为字符串读取,并对其应用逻辑。最后,公式/输出如下所示。请注意,我直接在下面的公式中插入了文本字符串,但是您将在示例表中看到它也可以解释单个单元格引用。

    式:
    =TCase&REPT("i want to convert this mIxEd sTRing into A TITLE cAsE string!!!",0)

    输出:

    I Want to Convert This Mixed String Into a Title Case String!!!

最后,除了病态的好奇心之外,我建议您使用此方法来查看Excel可以达到的限制。VBA是一个更简单,更优雅的UDF解决方案,但我至少乐于接受挑战。

注意:如果要更简单地查看示例文件中的示例,请使用“公式”功能区中的“评估公式”,并在我插入示例的一个单元格中移入/移出公式。完成后,我隐藏了所有底层的“命名范围”以将其清理干净,因此除非您全部隐藏它们,否则它们不会显示在“名称管理器”中

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.