【问题标题】:How to call VBA function from Excel cells (2010)?如何从 Excel 单元格(2010)调用 VBA 函数?
【发布时间】:2012-09-10 12:04:42
【问题描述】:

我使用 VBA 在工作簿中定义了一些函数,然后希望能够在单元格公式中使用它们 - 但 Excel 无法识别该函数。我刚得到#NAME?

试过了:

  • 意识到我已经创建了一个 XSLX 文件,我将它转换为一个 XSLM 文件。没用。
  • 从函数声明中删除了所有类型。没用。
  • 将该函数移到工作表 VBA 模块中。没用。
  • 在声明中添加了 Public。没用。

我错过了什么?

这也不是聪明的代码:

Function Square2(AnyNumber)

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

End Function

【问题讨论】:

  • 当没有任何工作时,我只是重新启动excel。似乎对我有用。
  • Microsoft Excel 对象,例如“Sheet1”或“ThisWorkbook”是类。我不相信您可以通过单元格访问您放入这些类中的函数。您可以在 VBA 中访问它们,例如ThisWorkbook.Square2() 但建议将所有 UDF 作为标准模块而不是工作表模块。

标签: excel-2010


【解决方案1】:

回答

将函数放在“ThisWorkbook”区域会导致#NAME? 问题。创建一个新模块(右键单击 VBAProject 文件夹,插入,新建模块) 并把函数放在那里。

步骤

  1. 打开 VBA 编辑器(Alt + F11 在 Windows 上/Fn + Option + F11 在 Mac 上)
  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)

【讨论】:

  • ps。另一个问题;如果您的模块名称与您的函数名称相同(例如,模块 Demo 包含 public function Demo(),您将得到一个 #NAME?。将模块名称修改为不同的名称(例如,DemoModule 解决了这个问题,就像使用公式中的完全限定名称(例如 =Demo.Demo()
  • 当我为第二个参数提供一个值时,它会报告:Mit dieser Formel gibt es ein Problem. Sie möchten gar keine Formel eingeben? ...
  • 为我工作,谢谢。我唯一要补充的是,我不需要将函数声明为 public。
  • 直到我将, 替换为; 到单元格中才对我有用。所以来自牢房的电话是给我的=findArea(B12;C12)
  • @JohnLBevan,感谢您的回答。这是我的问题。在 VBA 中仍然存在多么愚蠢的错误。 (您应该将其添加为 answer 而不是评论,我敢打赌您会获得更多荣誉。:-)
【解决方案2】:

我遇到了同样的问题,在为我工作而苦苦挣扎之后:

我的函数位于宏工作簿中名为 Personal.XLSB 的模块中。我在函数名称前加上个人宏工作簿文件名和!,所以如果函数名称是 theFunction(x,y) 我在单元格“=PERSONAL.XLSB!theFunction(x,y) 中输入。这有效。

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

【讨论】:

  • =PERSONAL.XLSB!FunctionName() 是我需要让它工作的位。谢谢!
【解决方案3】:

确保您未处于设计模式。

在 Excel 的开发人员选项卡上和 VBA 编辑器的运行/停止按钮旁边有一个设计模式按钮。如果它被选中,并且不允许您取消选择它,请尝试在启用宏的情况下重新打开工作簿。

如果它仍然启用,或者不允许宏运行,请确保宏已启用。

激活宏。

-- https://stackoverflow.com/a/20659823/258482

【讨论】:

    【解决方案4】:

    我遇到了同样的问题,包括一个工作函数后来停止工作并给出 #NAME 错误。通过确保模块的名称与函数的名称不同,我设法解决了这两个问题。我在 Module1 中有一个工作函数 F_1,我将模块名称更改为 F_1 并且它停止工作,现在回到 Module1 并且该函数再次工作。当我将模块名称从 F_2 更改为 Module2 时,我的第二个函数也开始工作了。

    【讨论】:

      【解决方案5】:

      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
      

      鉴于我看不到你的代码,你能试试下面的函数是否也适合你吗?如果是这样,请开始修改下面的函数,使其成为您的函数(例如,先更改名称并查看是否有效,然后更改参数数量并检查是否有效,然后更改参数名称)。

      【讨论】:

      • 我在这样的工作表中使用了你的函数:=Discount(100,2) 同样的问题。
      • 我确实按照您的建议更改了参数。
      • 只是想问一下,现在你是在工作表模块和工作簿模块之外定义函数吗?您不得在 Workheet 或 Workbook Modules 中定义。
      • 我尝试在 Worksheet 和 Workbook 模块中定义函数。没有工作。你说这是不可能的吗?在这种情况下,我可以在哪里定义在工作表单元格中使用的 VBA 函数?
      • Mark - 不要将这些函数放在工作表或工作簿模块中。插入一个新模块,并将函数放入该模块中。
      【解决方案6】:

      我打开 Excel,打开代码编辑器 (Alt+F11),选择新工作簿,插入新模块,输入

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

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

      我知道这不能完全回答你的问题,但这是我很幸运的食谱。

      【讨论】:

        【解决方案7】:

        我认为如果您的模块与您的函数同名,可能会出现问题。尝试重命名您的模块或函数。

        【讨论】:

        • 您的回答更像是评论,而不是对问题的有用解决方案。
        • 我不知道他给他的模块起的名字。刚刚通过这样做解决了我遇到的同样问题。
        【解决方案8】:

        激活宏。

        【讨论】:

          【解决方案9】:

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

          1. 将工作簿另存为 .xlsm

          2. 按照上面的建议启用宏

          3. 设置参考。在 VBA (Alt-F11) 中选择工具/参考,然后浏览到包含您要使用的宏的工作簿。检查列表中的引用。

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-03-18
            • 2013-09-18
            • 1970-01-01
            • 1970-01-01
            • 2013-09-29
            • 1970-01-01
            • 1970-01-01
            • 2010-10-25
            相关资源
            最近更新 更多