#名称? Excel中的VBA函数错误

时间:2013-09-16 14:13:04

标签: excel vba excel-vba

我正在制作我的第一个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中删除了注释',并使用调试工具进出每个函数步骤,因为它走过桌子。但是,当我使用=findPurchase()在Excel中引用该函数时,我遇到了#NAME?错误。当我开始输入其名称时,该功能甚至会显示在功能自动完成框中。当我编写带有和不带参数的其他函数时,我可以很好地引用它们,例如:

Function addtwo()
    addtwo = 1 + 2
End Function

我的功能错误导致它无法正常工作?

13 个答案:

答案 0 :(得分:32)

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

enter image description here

将该名称更改为find_Purchase,一切都会正常:)请参阅下图...

enter image description here

答案 1 :(得分:9)

我自己也有同样的问题。事实证明,我“保存为...”另一个文件和宏未启用该文件。顶部没有横幅,但生成了#NAME?错误。 我重新打开了文件,启用了宏,问题得到了解决。

答案 2 :(得分:5)

确保已将该功能放入标准模块中。错误消息表示Excel无法找到该功能。

答案 3 :(得分:2)

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

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

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

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

'
' Workbook open event
Private Sub Workbook_Open()
    Application.CalculateFullRebuild
End Sub

答案 4 :(得分:1)

检查&#34;信任对VBA项目对象模型的访问&#34;在宏安全的宏设置中

答案 5 :(得分:1)

这就是为什么我遇到该错误。到目前为止尚未提供此答案。

如果您打开了两个或更多工作簿(电子表格),则您的模块可能位于另一个工作簿下-并不是您唯一要进行计算的地方。这似乎似乎是不可能的,但是……打开开发者/ VBA代码编辑器后,Excel便希望向您显示每个打开的工作簿的结构(对象,模块等)。作为开发人员,这不是我期望的,但是确实如此。因此,像我一样,您可能按下了“添加模块”,并将代码放在了另一个工作簿和工作表中。

如果这是您的问题,则上述任何内容均无效。通过此VBA代码编辑器将您的VBA模块和代码移动到正确的电子表格中。

答案 6 :(得分:0)

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

答案 7 :(得分:0)

除了检查上面提到的一些项目之外,您可能还需要指定实际定义自定义函数的文件名,例如:细胞含量  = XLstart.xlsm!myCustomFunc(ARG1,Arg2)将 其中myCustomFunc在启动文件XLstart.xlsm中定义。

按照Excel帮助&#34;更正#NAME?错误&#34;:

在公式栏中,选择[可疑]功能名称。   在名称框(公式栏左侧)中,单击箭头,然后从Excel建议的列表中选择[用户定义的]函数。

这将按照上述格式添加文件名。

MS 2010,Windows 10。

答案 8 :(得分:0)

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

原来我有一个与Sub或UDF功能同名的宏! 我重命名了宏,然后它工作了

干杯

答案 9 :(得分:0)

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

答案 10 :(得分:0)

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

答案 11 :(得分:0)

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

无效代码:

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

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

我通过在打开的语句中添加参数“ local:= true”解决了该问题:

工作代码:

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

因为VBA在我的德语工作簿中期望英文功能名称。通过此参数,直接告诉VBA使用本地名称。

我希望这不会像我那样帮助某人放松几个小时...

答案 12 :(得分:0)

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

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

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

不确定所有这些步骤都是必需的,但只需重新启动计算机似乎就解决了我的问题。