2016-11-21 75 views
3

我在电子表格中插入下面的简单功能到一个模块: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 

我只想与细胞在相邻的命名变量来一补列柱。

奇怪的是,该功能可在一些细胞中,但在另抛出一个#N/A错误。在有名字的单元格中。

谁能帮我明白了吗?我不是VBA专家;我确实对这个问题做了一些研究,但是发现只有比这个更复杂的问题的答案。

谢谢。

+1

如果有一个“定义名称”整整(只)在你使用,那么你将得到该名称(如果有多于一个,则仅仅是第一遇到)细胞。如果没有“名字”直接进入这个单元格,那么你会得到“#N/A”。有什么细节在这里不起作用? –

+0

这个函数似乎对我很有用,它返回指针'cel'没有'Name'的#N/A值。 –

+2

名称的范围可以是工作簿或工作表。你没有限定你正在迭代的'Names'集合,所以它隐含地引用'ThisWorkbook.Names'(或'ActiveWorkbook.Names',...不知道..也可能是'ActiveSheet.Names'。是不是隐含的东西很好?) - 是否考虑到了?即在同一范围内的所有名称? –

回答

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 

第二部分也将展示范围包括细胞如果没有单参考被发现(输出与"* "启动(如果没有必要)

+0

Danke Dirk!我认为这解决了YowE3K发现的问题。谢谢你们的帮助。 (其中每一个,我都会学到一点。) – Steve

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, "'", "''")以确保表格名称中的任何嵌入式引号被两个引号替换。

+0

@DavidZemens - 不,这不起作用 - 例如一张名为'Sh e'et1'的表。到单元格A1的'RefersTo'将会是'='Sh''t1'!$ A $ 1'。因此,替换(nm.RefersTo,“'”,vbNullString)将会给出'='等于$ A $ 1',这将不匹配'= $'!您必须在等式两边进行替换,如果您有名为'Sh e'et1' **和**'Sh eet1'的工作表,则会出现问题。 (为什么任何人都会有这些名字的床单完全是另一个问题!!) – YowE3K

+0

@DavidZemens - 但我的方法也无法工作:( – YowE3K

+0

啊你说得对我认为'''在表名中是非法字符:) –

相关问题