【问题标题】:Resizing a named range deletes the range's Name structure调整命名范围的大小会删除范围的名称结构
【发布时间】: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


    【解决方案1】:

    您的问题很难理解,但我没有发现任何问题:

    Sub Tester()
    
        Dim theName As Name
    
        Set theName = ActiveSheet.Names.Add(Name:="myName", RefersTo:=ActiveSheet.Range("A1"))
    
        showIt theName  '>> Name:Sheet1!myName          Address:$A$1
    
        theName.RefersTo = ActiveSheet.Range("B1:B3")
    
        showIt theName  '>> Name:Sheet1!myName          Address:$B$1:$B$3
    
        theName.RefersTo = theName.RefersToRange.Resize(6, 4)
    
        showIt theName  '>> Name:Sheet1!myName          Address:$B$1:$E$6
    
    End Sub
    
    Sub showIt(nm As Name)
        Debug.Print "Name:" & nm.Name, "Address:" & nm.RefersToRange.Address
    End Sub
    

    顺便说一句,这看起来像是一个错字:

    .RefersTo = .RefersToRange.Offset(-1).Resize(2).Select
    

    Select 不属于那里

    编辑 你这样做:

     Set rResize = Range(scResizeRange)
    

    现在rResize 指向scResizeRange 中定义的范围,但rResize 和您命名的范围之间没有链接 - 两者是独立的。因此,如果您更改命名范围,然后再执行以下操作:

     rResize(iRow) = scFreda
    

    ...那么预计您将写入命名范围的原始位置

    【讨论】:

    • 蒂姆,感谢您及时回复这个问题,就像您对我最近关于另一个问题的另一个问题所做的那样
    • 首先,感谢您及时回复这个问题,就像您对我最近关于另一个问题的另一个问题所做的那样。 其次,我意识到如果我使用 Debug.Print 而不是输入 Watch 数据,这会让事情变得更容易理解。 第三,很抱歉没有删除 Select。我以为我已经这样做了。不幸的是,你似乎已经证实了我的想法,除非我遗漏了一些基本的东西。由 rResize 表示的范围已经存在于工作表中...
    • 因此,鉴于您所说的 Name 和 Range 对象是独立的(尽管我认为我在帖子中表明 Name 对象的更改会导致 Range 对象的更改)我该怎么做更改 Range 对象的方位,以便 rResize(iRow) = scFreda 确实写入预期的单元格。每次我想更改其边界时,我是否应该删除范围对象并重新创建?非常感谢您的耐心等待。
    • 如果您想更改命名范围所引用的范围,那么您需要使用该名称来访问该新范围。您使用了rResize,它只是一个指向 old 范围的指针,与名称对象没有任何联系
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-21
    相关资源
    最近更新 更多