如何从Excel单元格(2010)调用VBA函数?

34

我在一个工作簿中使用了VBA定义了一些函数,希望能在单元格公式中使用它们,但是Excel无法识别这些函数。我只会得到 #NAME?。

已尝试:

  • 意识到我创建的是XSLX文件,将其转换为XSLM文件。但没有效果。
  • 从函数声明中删除了所有类型。但没有效果。
  • 将函数移到工作表VBA模块中。但没有效果。
  • 在声明中添加Public。但没有效果。

我错过了什么?

这不是特别智能的代码:

Function Square2(AnyNumber)

'return the square of any integer
Square2 = AnyNumber * AnyNumber

End Function

1
当什么都不起作用时,我只需重新启动Excel。对我来说似乎有效。 - nawfal
1
Microsoft Excel对象,如“Sheet1”或“ThisWorkbook”,都是类。我不认为您可以通过单元格访问放置在这些类中的函数。您可以通过VBA访问它们,例如ThisWorkbook.Square2(),但建议将所有UDF放入标准模块而不是工作表模块中。 - Eddie
9个回答

55

回答

将函数放在"ThisWorkbook"区域可能会导致#NAME?问题。请创建一个新的模块(右键单击VBAProject文件夹,插入,新模块),并将函数放在其中。

步骤

  1. 打开VBA编辑器(Windows上按Alt + F11 / Mac上按Fn + Option + F11
  2. 右键单击VBAProject
  3. 选择插入 >> 模块
  4. Module1中创建一个Public函数,例如:

    Public Function findArea(ByVal width as Double, _
                             ByVal height as Double) As Double
        ' Return the area
        findArea = width * height
    End Function
    
  5. 像任何其他函数一样,可以从单元格中调用它:=findArea(B12,C12)

Macro Screenshot


4
注意事项:如果你的模块名和函数名相同(例如,模块Demo包含public function Demo()),你将会出现一个#NAME?的错误。更改模块名称为不同的名称(例如,DemoModule)或在公式中使用完全限定名称(例如,=Demo.Demo())可以解决这个问题。 - JohnLBevan
当我为第二个参数提供一个值时,它报告:Mit dieser Formel gibt es ein Problem. Sie möchten gar keine Formel eingeben? ... - Paul
1
对我有用,谢谢。唯一需要补充的是,我不需要将函数声明为公共的。 - JL_SO
直到我将单元格中的“,”替换为“;”,它才对我起作用。因此,对于我来说,从单元格调用的是=findArea(B12;C12) - Neuran
1
@JohnLBevan,感谢您的回答。这正是我的问题所在。VBA中仍然存在这样一个愚蠢的错误。 (您应该将其添加为答案而不是评论,我敢打赌您会得到更多的信用。 :-) - Randy Stegbauer
谢谢@RandyStegbauer;很高兴知道它有所帮助。随意将我的评论发布为答案并获得一些赞誉;) - JohnLBevan

8

我曾经遇到同样的问题,试了很多方法后终于找到了解决办法:

我的函数是在一个名为Personal.XLSB的宏工作簿中的模块里面,我在函数名前加上了个人宏工作簿的文件名和!,所以如果函数名为theFunction(x,y),我在单元格中输入"=PERSONAL.XLSB!theFunction(x,y)",这个方法可行。

请注意,PERSONAL.XLSB 对我来说始终是以隐藏模式打开的。


=PERSONAL.XLSB!FunctionName() 是我需要让它工作的那一部分。谢谢! - RazorSky

4

我曾遇到相同的问题,某个本来能够正常工作的函数后来却出现了 #NAME 错误。我通过确保模块名与函数名不同来解决了这两个问题。我在 Module1 中有一个能够正常工作的函数 F_1,当我把模块名改成 F_1 时,它就停止工作了;现在我又把模块名改回 Module1,这个函数又可以正常工作了。我的第二个函数也是这样,当我把模块名从 F_2 改成 Module2 时,它也恢复正常了。


4
请确保您不在设计模式下。
在Excel的开发人员选项卡上和VBA编辑器中的运行/停止按钮旁边有一个设计模式按钮。如果它被选中,而且无法取消选择,那么尝试启用宏后重新打开工作簿。
如果仍然启用或无法运行宏,请确保已启用宏。
激活宏。
- Excel 2010 - Excel 2007 -- https://dev59.com/jmct5IYBdhLWcg3wF5tF#20659823

1

如果您的模块和函数名称相同,可能会存在问题。尝试重命名您的模块或函数。


1
你的回答更像是一条评论,而不是对问题的有用解决方案。 - Piotr Dajlido
我不知道他给他的模块起了什么名字。只是通过这样做解决了我遇到的同样问题。 - Gustavo

1

XLSX文件和XLSM文件与此无关。格式在保存文件时起作用。(在XLSX中,保存文件时将剥离VBA代码)。

来自http://office.microsoft.com/en-us/excel-help/creating-custom-functions-HA001111701.aspx的以下代码在我的Excel新模块中运行得非常好。

Function Discount(quantity, price)
    If quantity >= 100 Then
        Discount = quantity * price * 0.1
    Else
        Discount = 0
    End If
    Discount = Application.Round(Discount, 2)
End Function

鉴于我无法看到您的代码,您能否尝试一下下面的函数是否也适用于您?如果是,请开始修改下面的函数,使其成为您的函数(例如,首先更改名称并查看其是否有效,然后更改参数数量并检查其是否有效,最后更改参数名称)。


1
我在工作表中像这样使用了您的函数:=Discount(100,2)。仍然存在同样的问题。 - Mark Bertenshaw
我按照你的建议更改了参数。 - Mark Bertenshaw
只是问一下,现在您是在工作表模块和工作簿模块之外定义函数吗?您不应该在工作表或工作簿模块内定义。 - Niraj Nawanit
我尝试在工作表和工作簿模块中定义函数,但都没有成功。你是说这是不可能的吗?如果是这样,在哪里可以定义在工作表单元格中使用的VBA函数? - Mark Bertenshaw
2
标记 - 不要将这些函数放在工作表或工作簿模块中。插入新模块,将函数放入该模块中。 - Jon Peltier
显示剩余2条评论

1

我打开了Excel,打开了代码编辑器(Alt+F11),选择了新工作簿,插入了一个新模块,输入了以下内容:

Function Decrement(i As Integer) As Integer
  Decrement = i - 1
End Function

然后我回到我的工作簿,在A1中键入=Decrement(2),然后按Enter,它就起作用了。当我输入=Decr时,Decrement出现在函数下拉列表中... 它被识别并且它起作用了。我甚至不需要保存工作簿。

我知道这不完全是你问题的答案,但这是我成功的方法。


0

如果您正在使用最新版本的Excel,想要在另一个工作簿中查看VBA函数,您需要:

  1. 将您的工作簿保存为.xlsm格式

  2. 按照上述建议启用宏

  3. 设置引用。在VBA(Alt-F11)中选择“工具/引用”,然后浏览包含您想要使用的宏的工作簿。在列表中勾选该引用。

    如果出现有关模块名称冲突的错误消息,请先在项目资源管理器中重命名它。


0

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