【发布时间】:2019-03-12 18:18:24
【问题描述】:
每当我尝试调整大小或以其他方式更改某个范围的单元格位置时,例如“A1:B1”到“A1:B2”与范围关联的名称结构被删除。 range.Name 的监视条目将在值列中显示为
应用程序定义或对象定义的错误
这似乎与是否有与之关联的名称无关。实际上,通过 RefersTo = 更改名称会自动删除名称结构。以下代码源自对问题 11031891 的回答,如何使用 VBA 重新定义命名范围?
Option Explicit
Enum eColumn
FIRSTCOLUMN = 1
SECONDCOLUMN = 2
End Enum
Enum eRow
FIRSTROW = 1
SECONDROW = 2
End Enum
Public Const scFred As String = "Fred"
Public Const scFreda As String = "Freda"
Public Const scAbsoluteValueRange As String = "AbsoluteValueRange"
Public Const scResizeRange As String = "ResizeRange"
Sub ResizeIt()
Dim iRow As Integer
Dim nAbsoluteValue As Name
Dim nResize As Name
Dim rAbsoluteValue As Range
Dim rResize As Range
Dim ws As Worksheet
Set ws = ActiveSheet
' **** Create Ranges ***
ws.Names.Add Name:=scAbsoluteValueRange, RefersTo:=Cells(FIRSTROW, FIRSTCOLUMN)
ws.Names.Add Name:=scResizeRange, RefersTo:=Cells(SECONDROW, SECONDCOLUMN)
Set rAbsoluteValue = Range(scAbsoluteValueRange)
Set rResize = Range(scResizeRange)
Set nAbsoluteValue = ws.Names.Item(scAbsoluteValueRange)
Set nResize = ws.Names.Item(scResizeRange)
' **** Change Ranges ***
' give an absolute reference:
With nAbsoluteValue
.RefersTo = ws.Cells(SECONDROW, FIRSTCOLUMN)
End With
iRow = FIRSTROW
rAbsoluteValue(iRow) = scFred
' or, resize relative to old reference:
With nResize
.RefersTo = .RefersToRange.Offset(-1).Resize(2).Select
End With
iRow = FIRSTROW
rResize(iRow) = scFreda
End Sub
如果我将代码运行到“创建范围”阶段结束,我会获得两个范围:
AbsoluteValue 占据“A1” 调整占用“B2”的大小
观察窗口证实了这一点
观看:+:nAbsoluteValue:“=Sheet1!$A$1”:名称/名称:Module1.ResizeIt
观看:+:rAbsoluteValue.Name:“=Sheet1!$A$1”:Variant/Object/Name:Module1.ResizeIt
观看:+:nResize:“=Sheet1!$B$2”:名称/名称:Module1.ResizeIt
观看 : + : rResize.Name : "=Sheet1!$B$2" : Variant/Object/Name : Module1.ResizeIt
然后我通过使用 Name 对象将 AbsoluteValue 的位置更改为“A2”
在监视窗口中我得到
观看:+:nAbsoluteValue:“=Sheet1!$A$2”:名称/名称:Module1.ResizeIt
Watch : rAbsoluteValue.Name : : Variant/Integer : Module1.ResizeIt
但是,当我尝试写入单元格“A2”(应该是范围中的第一行)时,结果 Fred 进入“A1”。换句话说,范围位置没有移动 编 对于调整大小范围,我得到了类似的结果:
观看:+:nResize:“=Sheet1!$B$1:$B$2”:名称/名称:Module1.ResizeIt
Watch : : rResize.Name : : Variant/Integer : Module1.ResizeIt
但是,当我尝试写入单元格“B1”(应该是范围中的第一行)时,结果 Freda 进入“B2”。同样,范围位置没有移动
名称管理器指示单元格在两种情况下都已更改为正确的位置
【问题讨论】:
标签: excel vba excel-2007 named-ranges