我正在尝试使用 VBA 创建一个命名范围。FirstBodyCell
和ColumnCode
都是单个单元格。我希望命名范围最终被定义为如下所示的内容(取决于所在FirstBodyCell
的列):
=Offset(Sheet1!$E$8,0,0,COUNTA(Sheet1!$E:$E)-COUNTA(Sheet1!$E$1:$E$7),1)
使用下面的子项会引发
运行时错误‘438’:对象不支持此属性或方法
并指向带有 的行.Name = ColumnCode.Value
。您知道此代码有什么问题吗?
Sub CreateNamedRange(FirstBodyCell As Range, ColumnCode As Range)
With ActiveWorkbook.Names
.Name = "col_" & ColumnCode.Value
.RefersToR1C1 = "=Offset(" & FirstBodyCell & ",0,0," & _
"COUNTA(" & Columns(FirstBodyCell.Column) & ")-COUNTA(" & _
Range(Cells(1, FirstBodyCell.Column), FirstBodyCell.Offset(-1, 0)) & _
"),1)"
End With
End Sub
答案1
Workbook.Names
是一个产生集合类的属性Names
,它公开诸如Add
、、和之类Count
的成员。Parent
Item
对象Names
没有Name
属性或RefersToR1C1
成员(因此出现错误 438 - 对象不支持/公开成员/属性)。
您想要调用Add
该对象的成员 - 该函数将您尝试在那里分配的值作为参数。此外,.Address
将返回非 R1C1 格式的地址。尝试使用RefersTo
而不是RefersToR1C1
。
With ActiveWorkbook.Names.Add( _
Name:="col_" & ColumnCode.Value, _
RefersTo:="=Offset(" & FirstBodyCell & ",0,0," & _
"COUNTA(" & Columns(FirstBodyCell.Column) & ")-COUNTA(" & _
Range(Cells(1, FirstBodyCell.Column), FirstBodyCell.Offset(-1, 0)) & _
"),1)")
'the With block variable is the Name object that was created+added to the Names collection:
Debug.Print .Name
End With
笔记斯科特·克雷纳指出您可能想要使用您在那里提供的.Address
对象Range
,因此的实际值RefersToR1C1
将是:
RefersTo:="=Offset(" & FirstBodyCell & ",0,0," & _
"COUNTA(" & Columns(FirstBodyCell.Column).Address & ")-COUNTA(" & _
Range(Cells(1, FirstBodyCell.Column), FirstBodyCell.Offset(-1, 0)).Address & _
"),1)")