繁体   English   中英

为什么我的 Excel 2010 UDF 会退出使用#NAME? 错误?

[英]Why would my Excel 2010 UDF quit working with a #NAME? error?

我有 Excel 2010。几个月前,我写了一些 UDF 并让它们调试和工作。 今天我更改了电子表格中的一个值,突然所有 UDF 都显示了#NAME?

最终我决定从头开始。 我只用一个 UDF 创建了一个新工作簿。 在这里,它的全部内容:

Function say7() As Integer
    say7 = 7
End Function

然后我转到 Sheet1,在 A1 框中输入“=say7()”。 我得到了“#NAME?”。

如果我输入“sa”,下拉菜单会显示“say7”。 我可以按 Tab 或 Enter,它会填写 function 名称。 然后它说#NAME?。

我了解 Excel 2010 不再受支持。 Microsoft 是否采取了一些措施来破坏 UDF?

我的 XLSM 几周前还在工作。 事实上,我进行更改的文件是原始电子表格的副本。 我回到原来的状态,在一个单元格中更改了一个应该强制重新计算的值,它说#NAME?。 我没有更改代码,我没有更改任何设置,什么都没有。 我唯一改变的是一个数据值,不知何故,这使得 function 名称不再被识别。

更新:几位张贴者指出,“say7”不是 Excel 中 function 的合法名称,使用此名称会产生 #REF? 错误。 真的。 但我的问题是我得到了#NAME? 错误,不是#REF? 错误。 在我尝试创建一个简化的场景时——为了确保问题不是 function 中的一些错误——我创建了一个新的、故意非常简单的 function,它具有相同的 #NAME? 错误。 是的,我给这个 function 取了一个非法名称,这混淆了我的问题。 我为混乱道歉。 解释为什么 say7 是一个无效的名称是有趣且有用的信息,但遗憾的是并没有解决我原来的问题。

当您编写 function 时,有命名它的常规规则。 其中一个说

您不应使用与 Visual Basic 中的函数、语句和方法相同的任何名称,因为您可能会在语言中隐藏相同的关键字。

Say7这个名字虽然看起来很无害,但与名为SAY的编号为 12895 的列发生冲突。 所以原则上,下面对我有用,但我没有 Excel 2010 来查看和确认。

Public Function SaySeven() As Integer
    SaySeven = 7
End Function

编辑:

在阅读了 OP 自己的回答帖子和其他详细信息后,我可以想到另一种情况,我们可能会遇到#NAME错误。 这可以很容易地复制。

步骤 1:创建 UDF 并保存工作簿。 当您这样做时,不应将其保存在 Excel 的受信任位置,并且该文件不应被识别为受信任。 如果受信任,则 Excel 不会提示启用活动内容。 在创建时,Excel 将产生没有任何错误的结果。 现在关闭工作簿。

步骤 2:重新打开此工作簿。 您将收到以下消息提示。 在此处输入图像描述

忽略此消息,即不要按“启用内容”按钮。 OP 可能在某处错过了此消息。

第三步:如果在之前的session中实现了UDF并且返回了一个有效的结果,那么在重新计算时它不会返回任何错误。 但是,如果您在新单元格中输入此 UDF,则 Excel 将返回#NAME错误。 在下面的快照中,绿色单元格和黄色单元格都包含完全相同的公式,即

=dist3()

在此处输入图像描述

但结果不同。

所以总而言之:UDF 名称dist3是有效的,它应该像 OP 在他以后的帖子中引用的那样工作。 但是,在上述特定情况下,可能会遇到这种错误。 但是,它将适用于所有 UDF,而不仅仅是dist3

我已经在 Excel 的Office 365版本中对此进行了测试,但我认为不同版本的这种行为不会有任何重大差异。

我最终部分想通了。 至少足以让它工作。

Excel 通常会阻止您运行 UDF,除非您明确授予它权限。 当您尝试使用第一个 UDF 时,它会在 window 顶部弹出一个问题,请求许可,如果您不给予许可,那么 UDF 将无法识别,您会得到 #NAME? 他们的错误。

显然 - 这是我不确定的部分 - 告诉我对 Excel 2010 的支持已过期的消息显示在此消息的顶部,因此我看不到它。 或类似的东西。 我将文件复制到另一台具有较新版本的 Excel 的计算机上,我收到了消息。 我单击确定,UDF 工作。 然后我保存它并将其复制回原始计算机,它工作正常。

正如我之前在此单击确定并且此答案显然与文件一起保存,我不确定它为什么再次询问。 也许对文件的某些更改会使先前的答案无效? 我不确定。

我创建了一个新文件,并看到有关“UDF 好吗?”的消息。 在那一个。 因此,也许我认为该消息已被过期通知覆盖的理论是不正确的。 我想有可能消息一直都在那里,而我只是瞎了眼,没有看到。 这似乎不太可能,因为我正在寻找一些解释,但是,等等。

在我这篇文章的第一个版本中,我说过 function 名称“say7”有效。 这是不正确的。 当我让电子表格工作时,我回到了我原来的电子表格,其中电子表格中引用的 function 被称为“dist3”,它可以工作。 (还有其他函数,但它们都是从 dist3 中调用的。)

无论如何,在我创建“say7”之前,我试图让它与一个名为“dist3”的 function 一起工作,而 #NAME? 也失败了。 正如我在问题中所说,它在一个月前有效,我没有更改任何 function 名称,所以我知道非法 function 名称不是问题。 我尝试创建一个简单的 function 来测试问题是错误的,因为我使用了非法的 function 名称,这会产生不同的问题。

看到@shrivallbha redij 回复的逻辑,我将函数的名称更改为 SAYG(考虑到 G 定义了第 7 列),但仍然出现 #NAME 错误。 然而,这可以通过在 function 调用中传递一个参数来避免,即使该参数未被 function 使用或者它是空白的。

=SAYG - 返回错误

=SAYG(A1) - 返回 7

=SAYG() - 返回 7

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM