23

我正在制作我的第一个 VBA 程序并尝试运行以下函数。该函数检查第一行的特定命名范围,该范围的值不大于其前导值,但小于 1。

Public Function findPurchase()

Dim CRT As Range
Set CRT = Range("CostRateTable")

Dim existsBetter As Boolean
existsBetter = True

Dim r As Integer
r = 2
Dim c As Integer
c = 4

While existsBetter

    Dim Found As Boolean
    FoundBetter = False

    While Not FoundBetter And c <= CRT.Columns.Count
        If CRT(r, c) > CRT(r, 2) And CRT(r, c) < 1 Then
            FoundBetter = True
        Else
            c = c + 1
        End If
    Wend


    existsBetter = FoundBetter
    If existsBetter Then
        r = r + 1
    End If
Wend

findPurchase = CRT(r, 3)
'MsgBox(findPurchase)
End Function

我知道该函数做了它应该做的,因为我已经手动检查了值表,从 MsgBox 中删除了注释 ',并使用调试工具在每个函数步骤中步入和退出。桌子。但是,当我在 Excel 中引用该函数时,=findPurchase()我得到了一个#NAME?错误。当我开始输入其名称时,该功能甚至会出现在功能自动完成框中。当我编写其他函数时,无论有无参数,我都可以很好地引用它们,例如:

Function addtwo()
    addtwo = 1 + 2
End Function

我的功能做错了什么导致它不起作用?

4

13 回答 13

47

您收到该错误是因为您有一个与函数同名的模块。

在此处输入图像描述

更改该名称find_Purchase,一切都会好起来的:)请参见下图...

在此处输入图像描述

于 2013-09-17T04:57:57.483 回答
18

我自己也有同样的问题。原来我“另存为...”另一个文件和宏没有为该文件启用。顶部没有出现横幅,但#NAME?产生了错误。我重新打开文件,启用宏,问题就解决了。

于 2014-11-24T20:00:47.020 回答
10

确保您已将函数放置在标准模块中。错误消息意味着 Excel 找不到该函数。

于 2013-09-16T14:20:47.493 回答
5

当 Excel 打开包含 VBA 代码的未知工作簿时,它通常会要求用户启用宏(取决于应用程序设置)。

如果用户随后启用宏,则将启动所有事件驱动的过程,例如auto_open或其他。

然而,自定义 VBA 函数需要完全重新计算工作簿。否则函数返回值仍然是#NAME,因为计算只是在打开工作簿后直接完成。

为了在第一次打开时直接工作,必须在workbook_open事件中添加以下行

'
' Workbook open event
Private Sub Workbook_Open()
    Application.CalculateFullRebuild
End Sub
于 2016-09-28T14:14:00.223 回答
2

在宏安全性的宏设置中选中“信任对 VBA 项目对象模型的访问”

于 2017-08-31T13:38:38.110 回答
2

这个问题的一个原因是安全限制。我遇到了这个问题,我从安全中心激活了“启用所有宏”,问题就解决了

于 2019-08-07T05:24:56.550 回答
1

当其他一切看起来都很好时,我的一个功能也遇到了类似的持续性问题。打开工作表并转到开发人员选项卡。打开 VBA,然后返回开发人员功能区选择“查看代码”。查看它是否打开特定于该工作表的任何类似代码(除了您的模块)(例如 Sheet2(代码)。我发现除了模块之外,我还复制了工作表上的代码。删除“工作表”代码。(您可能需要保存工作簿并在此阶段重新打开。当我删除工作表代码时,模块功能然后工作。

于 2013-11-06T17:03:07.713 回答
1

这就是我收到该错误的原因。到目前为止还没有提供这个答案。

如果您打开了两个或更多工作簿(电子表格),那么您的模块可能位于另一个工作簿下 - 而不是您想要进行计算的唯一一个。这似乎是不可能的,但是……只要您打开 Developer/VBA 代码编辑器,Excel 就会向您展示每个打开的工作簿的结构(对象、模块等)。这不是我作为开发人员所期望的,但它确实存在。所以像我一样,您可能已经按下“添加模块”并将代码放入另一个工作簿和工作表中。

如果这是您的问题,那么上面提到的任何内容都不会起作用。将您的 VBA 模块和代码移动到通过此 VBA 代码编辑器可见的正确电子表格中。

于 2020-07-02T20:57:07.643 回答
1

In addition to checking some of the above mentioned items, you might need to specify the filename where the custom function is actually defined, e.g. cell content =XLstart.xlsm!myCustomFunc(Arg1,Arg2) where myCustomFunc is defined in the startup file XLstart.xlsm.

Following the Excel help for "Correct a #NAME? error":

In the formula bar, select the [suspect] function name. In the Name Box (to the left of the formula bar), click the arrow and then select a [user-defined] function from the list that Excel suggests.

This will add the filename per the above format.

MS 2010, Windows 10.

于 2017-08-15T13:53:25.160 回答
0

简短的回答 - 如果该功能以前有效,请重新启动您的计算机。

长答案-我也遇到过同样的事情。问题是我创建的功能已经工作了几个月。然后有一天它刚刚开始显示#NAME 错误,而不是像以前那样工作。我曾尝试关闭所有其他 excel 工作簿,甚至一起关闭 excel 并重新打开工作表。似乎没有任何效果。然后为了好玩,我将代码编辑到我知道 VBA 会抱怨存在编译错误的地方。令人惊讶的是,它没有抱怨。好的...无论如何我保存并关闭了excel,然后重新启动了我的计算机。

重新启动后,我重新打开了 excel 工作簿。然后VBA终于给了我一个编译错误。所以我把我的函数改回了我之前的原始代码,现在工作表正在运行它应该的函数。不再有 #NAME 错误。

不确定所有这些步骤都是必要的,但简单地重新启动计算机似乎已经解决了我的问题。

于 2021-01-25T16:24:09.027 回答
0

没错,我有相同的(在 Excel 2010 中),当我迁移到 Excel 2016 时,显示了函数原型,但是当我完成函数时,#NAME 错误显示为弹出窗口......所以代码是从未触发。

原来我有一个与 Sub 或 UDF 函数同名的宏!我重命名了宏,然后它起作用了

干杯

于 2017-10-12T18:43:27.180 回答
0

此解决方案适用于以“美国英语”以外的其他语言安装 Excel 的用户:在制作活动工作簿的副本以复制它并随后立即打开副本时,我遇到了类似的问题:

非工作代码:

   ThisWorkbook.SaveCopyAs NewFileName
   Set wb = Workbooks.Open(FileName:=NewFileName)

这总是向我显示几个带有错误 2029 /“#NAME?”的单元格。如果我通过文件菜单“以官方方式”打开工作簿,它会按预期工作。

我通过在 open 语句中添加参数“local:=true”解决了这个问题:

工作代码:

   ThisWorkbook.SaveCopyAs NewFileName
   Set wb = Workbooks.Open(FileName:=NewFileName, Local:=True)

正如 VBA 在我的德语工作簿中所期望的英文函数名称一样。通过这个参数,VBA 被直接告知使用本地名称。

我希望这可以帮助某人不要像我一样浪费几个小时......

于 2020-11-12T12:52:42.457 回答
0

我为#NAME 找到的另一个原因是什么?错误是具有自定义函数的宏工作簿具有与函数名称相同的范围名称。我更改了函数名称并解决了问题。

于 2018-02-14T21:28:39.110 回答