Excel VBA功能在某些地方有效但在其他地方无效

时间:2016-11-21 18:19:06

标签: excel vba excel-vba

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

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

我只想用相邻列中单元格的命名变量填充一列。

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

任何人都可以帮助我理解吗?我不是VBA专家;我确实对这个Q做了一些研究,但发现只有答案比这更复杂的问题。

感谢。

2 个答案:

答案 0 :(得分:4)

要获取名称,您可以使用以下内容:

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

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

答案 1 :(得分:4)

尝试将您的功能更改为:

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的评论,我更新了公式以执行Replace(cel.Parent.Name, "'", "''"),以确保工作表名称中的任何嵌入式引号都被两个引号替换。