Excel VBA函数在某些地方有效,但在其他地方无效

Excel VBA函数在某些地方有效,但在其他地方无效,vba,excel,Vba,Excel,我在电子表格的模块中插入了以下简单函数: Function CellName(cel As Range) As Variant Dim nm As Name For Each nm In Names If nm.RefersTo = "=" & cel.Parent.Name & "!" & cel.Address Then CellName = nm.Name Exit Function

我在电子表格的模块中插入了以下简单函数:

Function CellName(cel As Range) As Variant
Dim nm As Name
    For Each nm In Names
        If nm.RefersTo = "=" & cel.Parent.Name & "!" & cel.Address Then
            CellName = nm.Name
            Exit Function
        End If
    Next
CellName = CVErr(xlErrNA)
End Function
我只想用相邻列中单元格的命名变量填充一列

奇怪的是,这个函数在某些单元格中有效,但在其他单元格中它会抛出一个“N/A”错误。在有名称的单元格中

有人能帮我理解吗?我不是VBA专家;我对这个问题做了一些研究,但只找到了比这个问题复杂得多的答案


谢谢。

无论他们身在何处,您都可以使用以下内容:

Public Function CellName(cel As Range) As Variant
  Dim nm As Name, sht As Worksheet

  For Each nm In ThisWorkbook.Names
    If nm.RefersTo = "=" & cel.Parent.Name & "!" & cel.Address Then
      CellName = nm.Name
      Exit Function
    End If
  Next

  For Each sht In ThisWorkbook.Worksheets
    For Each nm In sht.Names
      If nm.RefersTo = "=" & cel.Parent.Name & "!" & cel.Address Then
        CellName = nm.Name
        Exit Function
      End If
    Next
  Next

  '----- skip from here if you only want single-cells

  For Each nm In ThisWorkbook.Names
    If Not Intersect(Range(nm.RefersTo), cel) Is Nothing Then
      CellName = "* " & nm.Name
      Exit Function
    End If
  Next

  For Each sht In ThisWorkbook.Worksheets
    For Each nm In sht.Names
      If Not Intersect(Range(nm.RefersTo), cel) Is Nothing Then
        CellName = "* " & nm.Name
        Exit Function
      End If
    Next
  Next

  '----- skip till here if you only want single-cells

CellName = CVErr(xlErrNA)

End Function

第二部分还将显示包含单元格的范围(如果未找到单个引用)(输出以
“*”
开头)(如果不需要,可以删除)

尝试将函数更改为:

Function CellName(cel As Range) As Variant
    Dim nm As Name
    For Each nm In Names
        If nm.RefersTo = "=" & cel.Parent.Name & "!" & cel.Address Or _
           nm.RefersTo = "='" & Replace(cel.Parent.Name, "'", "''") & "'!" & cel.Address Then
            CellName = nm.Name
            Exit Function
        End If
    Next
    CellName = CVErr(xlErrNA)
End Function
为了保留语法规则,某些工作表名称需要用引号括起来


编辑:根据David Zemens的评论,我已经更新了公式,以执行
替换(cel.Parent.Name,“”,“”)
,以确保工作表名称中的任何嵌入引号都被两个引号替换。

如果您使用的单元格有一个“定义名称”,那么您将获得该名称(如果有多个,则仅是它遇到的第一个)。如果没有直接指向此单元格的“名称”,则您将获得“
\N/A
”。什么细节在这里不起作用?此函数似乎对我起作用,它返回引用对象
cel
的#N/A值,但该引用对象没有
名称
。名称可以限定在工作簿或工作表的范围内。您没有限定要迭代的
名称
集合,因此它隐式引用
此工作簿。名称
(或
ActiveWorkbook.Names
,…不确定..可能是
ActiveSheet.Names
也..隐式的东西不是很好吗?)-是否考虑到了这一点?也就是说,所有的名称都在同一范围内吗?Dirk:例如,工作表“模型输入”的单元格D3在单元格E3中,我有{=cellname(D3)},它在同一工作簿中产生#N/a,在“输入”页上的单元格C3中,值为588000,名称为属性大小。在单元格D3中,公式是{=cellname(C3)},它产生“属性大小”看到了吗?我很困惑。但是,就像我说的,我不是这方面的专家。我会猜测一下,如果工作表名称包含空格或其他“奇怪”字符,那么它在工作表上不起作用。在这种情况下,
引用
看起来像
“=”&cel.Parent.name&“!”&cel.Address Then
。例如,
指的是
=模型输入的
。$D$3
将因
-
而无效,因此必须使用引号才能使其有效。Danke Dirk!我认为这解决了YowE3K遇到的问题。谢谢你们两位的帮助。(其中每一位,我都学到了一点。)@DavidZemens-不,这不起作用-以一张名为
Sh e'et1
的表格为例。单元格A1的
referesto
='Sh e''t1'!$a$1
替换(nm.referesto,“”,vbNullString)因此,
将给出
=Sh et1!$A$1
,这将与
=Sh e't1!$A$1
不匹配。您必须在等式的两侧进行替换,如果您有名为
Sh e'et1
Sh eet1
的工作表,则会出现问题(为什么有人会有这些名称的工作表完全是另一个问题!!)啊哈,你说得对,我假设
在sheetname中是非法字符:)@DavidZemens-我在
cel.Parent.Name
上使用了替换符,这应该可以解决问题。(我原以为
在sheetname中也会无效-令人惊讶的是什么是允许的,什么是不允许的。)工作:)