在Excel VBA中创建自定义工作表函数

14

我模糊地记得可以使用VBA函数在Excel中计算值,就像这样(作为单元格公式):

=MyCustomFunction(A3)

能做到吗?

编辑:

这是我的VBA函数签名:

Public Function MyCustomFunction(str As String) As String

该函数位于ThisWorkbook模块中。如果我像上面那样在工作表中尝试使用它,我会收到#NAME?错误。


解决方案(感谢codeape):当函数定义在ThisWorkbook模块中时,它是不可访问的。它必须位于一个“适当”的模块中,即手动添加到工作簿中的模块中。


值得注意的是,如果您使用.xlsx扩展名保存工作簿,则较新版本的Excel将禁用VBA。 您需要使用.xlsm扩展名保存它,以启用VBA。 - Simon Elms
如果你还没有保存工作表文件,那么你可能也需要保存一下。然后关闭并重新打开它可能会解决问题。但是,如果你已经更改了公式,你可能需要重新应用它。 - prot
2个回答

21

可以。你只需在一个模块中定义一个VBA函数。

请参见http://www.vertex42.com/ExcelArticles/user-defined-functions.html,其中有一个很好的介绍和示例。

这里是一个简单的示例:

  • 创建一个新工作簿
  • 切换到VBA视图(Alt-F11)
  • 插入一个模块:插入|模块
  • 模块内容:
Option Explicit
Function MyCustomFunction(input) MyCustomFunction = 42 + input End Function
  • 切换回工作表(Alt-F11),并输入一些值:
A1: 2
A2: =MyCustomFunction(A1)

3
嗯,似乎我选择的模块不对。它不能放在ThisWorkbook模块中,而是应该单独放置在一个模块中。谢谢。 :) - Tomalak
你的函数签名有误。使用“未类型化”的参数和返回值。我不记得当你省略类型时,VBA实际上会做什么,我猜它会使用Variant类型。 - codeape
我其实不确定签名是否错误。我还没有测试过。但无论如何,最好使用变量 - 因为这样你可以同时使用单元格引用(作为范围对象传递)和常量(作为浮点数、字符串或其他类型传递)来调用函数。 - codeape
由于这将是一个快速而肮脏的临时解决方案,传入一个字符串就足够了。但下次我需要它时会考虑一下:) - Tomalak
参数可以是有类型的或无类型的(变体),两种方式(和混合)都可以工作。如果指定了类型,Excel/VBA 将尝试强制将输入转换为指定的类型,这可能是好事,也可能不是好事。 - Mike Woodhouse

4

需要替换基础关键字input,建议使用num。你也可以进一步指定类型,例如variant。

Function MyCustomFunction(num As Variant)
    MyCustomFunction = 42 + num
End Function

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接