在单元格公式中从当前工作簿执行VBA函数时出现错误#name(法语版本为#nom)



当我在单元格的公式中使用VBA函数时,我遇到了一个可能非常简单的问题,当使用该函数的宏(用于测试)正常执行时,我得到了单元格内容"#NAME"(找不到函数?)(显示单元格的所需内容,函数的返回值,从完整路径中提取文件名)。

上下文:

我以前(12年多前)已经开发了,可能是5万个VBA指令,使用office2003。今天我不得不再次用Office365开发一些宏。因此,从那时起,我已经忘记了很多,一些功能可能会发生变化,这可能会变得棘手(我需要重新阅读我的旧软件来回忆我所有的知识,但我现在无法访问)

问题

  • 使用VBA中创建的函数时,会出现错误"#name"关联到当前工作簿。没有解释,没有帮助,我试着在几个小时内找到了一些东西,但我什么也没找到。
    • 我也为测试(参见代码)开发了一个调用函数的"sub",他的执行是成功的,但
    • 我无法从任何单元格的公式中运行函数
    • 我已经测试了宏的安全参数,并暂时完全解锁了执行,还将本地目录声明为自信区域

注意:此代码作为示例进行了详细说明

代码

Public Function FNameOf(CellPointed As Range)
Dim CurCell As Range
Dim Text1 As String
Dim Text2 As String
Set CurCell = CellPointed
Text1 = CurCell.Value
Text2 = Mid$(Text1, InStrRev(Text1, "") + 1, Len(Text1))
FNameOf = Text2
End Function
Sub DispFileName2()
Dim style, disp, titre
Dim Cursel As Range
'Cursel = ActiveCell
disp = FNameOf(ActiveCell)
style = vbOKOnly
titre = "Nom du fichier extrait du texte (fullpath) de la cellule courante"
MsgBox disp, style, titre
End Sub

如果我提交宏DispFileName2,如果获得从当前单元格的内容的路径中提取的文件名的消息

如果我设置了一个单元格的形式:

=FNameOf(AnotherCell) 'which contains a fullpath to a file

我总是收到错误"#NOM"(法语版),或者,我想是的,"#NAME"(英语版),就好像函数名(ref)在工作簿中是未知的一样(代码没有到达,第一条指令上设置了停止)

原因是什么?

请将您的用户定义函数放在模块中的某个位置(既不在"ThisWorkbook"中,也不在单个工作表的代码中,例如"Feuil1")
您还应该添加结果声明As String
我知道这个例子仅供参考,但你可以缩短它:

Public Function FNameOf(CellPointed As Range) As String
FNameOf = Mid(CellPointed.Value, InStrRev(CellPointed.Value, "") + 1)
End Function

我刚刚获得了解决方案,同时在几个选项卡中阅读了以前编辑过的线程的更多细节。它被解释为:线程12351339

文本为:

Microsoft Excel对象,如"Sheet1"或"ThisWorkbook"类。我不相信你能访问你放入的函数这些类通过一个单元格。您可以在VBA中访问它们,例如。ThisWorkbook.Square2(),但建议将所有UDF放入标准模块,而不是工作表模块Eddie 2017年9月28日13:49

默认情况下,创建面板定义与当前工作表关联的代码,然后该函数对工作表不可见,而子函数是工作表的宏

我已经创建了一个模块,该函数已经立即运行。

向致以最良好的问候

三重

注意:我以前从未遇到过可见性的问题,因为从一开始,VBA用户类和模块的开发就结合了多个Excel工作簿和Word以及一个邮件管理器activeX等等…

我保留这个主题是因为解释、代码和关键字可能更容易为其他人找到解决方案。