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中也会无效-令人惊讶的是什么是允许的,什么是不允许的。)工作:)