【问题标题】:Named Range Duplication/ Formula Altering命名范围重复/公式更改
【发布时间】:2016-11-22 13:30:09
【问题描述】:

我目前正在使用命名范围的选项卡。它们都与第 1 类相关联。我想将这些单元格复制两次,为第 2 类和第 3 类创建相同的列。除了为接下来的两个类附加 _2/_3 之外,命名范围应该保持不变。我还需要在每列中更改公式,但包含正确的后缀(_2/_3)。

这是一个简化版本,可以更好地解释我想要做什么:

**Class 1** 

  Lives         
  Age       
  Adjust        
  Claim     
  Risk      

**Class1    Class2      Class3**

  Lives     Lives_2     Lives_3

  Age       Age_2       Age_3

  Adjust    Adjust_2    Adjust_3

  Claim     Claim_2     Claim_3

  Risk      Risk_2      Risk_3

这些代表细胞的名称;它们还都包含在每个类中链接的公式。已完成的 1 类区域有 9 列和 120 行。我希望第二类填充第 10 到 18 列,第三类填充接下来的 9。这是我正在使用的代码,试图只更改名称,但我没有成功:

Sub ChangeNames()
    Dim OldName As String
    Dim NewName2 As String
    Dim NewName3 As String
    Dim rng As Range



    For r = 1 To 127
        For c = 1 To 10
            If IsNamedRange(Cells(r, 1 + c)) Then
                    Set rng = Sheets("Medical").Cells(r, 1 + c)

                    OldName = rng.Name
                    NewName2 = OldName & "_2"
                    NewName3 = OldName & "_3"

                    Sheets("Medical").Cells(r, 11 + c).Name = NewName2
                    Sheets("Medical").Cells(r, 21 + c).Name = NewName3

            End If

        Next c
    Next r


End Sub

Function IsNamedRange(MyRange) As Boolean
    Dim vntName As Variant
    On Error Resume Next
        IsNamedRange = MyRange.Name <> ""
    Exit Function
End Function

VBA 可以做到这一点吗?任何帮助将不胜感激!

子名称() 将此作为字符串调暗 将旧名称调暗为字符串 将 NewName2 调暗为字符串 将 NewName3 调暗为字符串 将 x 调暗为整数 Dim y As Integer

For Each this In Workbook.names
    If Range(this).Worksheet = "Medical" Then
        NewName2 = Range(this).Name & "_2"
        NewName3 = Range(this).Name & "_3"
        x = Range(this).Column
        y = Range(this).Row
        Sheets("Medical").Cells(x, 10 + y).Name = NewName2
        Sheets("Medical").Cells(x, 20 + y).Name = NewName3
    End If

Next this

结束子

【问题讨论】:

  • VBA 可以做到这一点 - 是的。 但我没有成功 - 如果您详细说明什么不起作用,我们可以为您提供更多帮助。
  • 当我运行上面的代码时;旧名称变量的值为“=Medical!$b$3”,而不是单元格名称 Med_Prod——我如何让它返回名称范围而不是单元格位置。如果我需要进一步澄清,请告诉我
  • 名称是在工作表级别还是工作簿级别定义的?
  • 名称是在工作簿级别定义的
  • 这会很复杂......您将不得不遍历工作簿中的名称集合 - 确保它们在您想要的工作表上,然后定义它们所在的列,然后使用偏移量和计数器将它们设置为 *n* 列与 name_*x*

标签: vba excel named


【解决方案1】:

试试这个代码,您可能需要对偏移量进行小幅调整以适应您的确切数据集,但我尽可能精确地定义它。

Sub ChangeNames()

    Dim rName As Name
    For Each rName In ThisWorkbook.Names

        If rName.RefersToRange.Parent.Name = "Medical" Then

            Select Case rName.RefersToRange.Column

                Case 2 To 10

                    For i = 1 To 2

                        Dim sName As String
                        sName = "=" & rName.RefersToRange.Offset(, i * 10).Parent.Name
                        sName = sName & "!" & rName.RefersToRange.Offset(, i * 10).Address
                        ThisWorkbook.Names.Add rName.Name.Name & "_" & i + 1, RefersTo:=sName

                    Next

            End Select

        End If

    Next

End Sub

【讨论】:

  • 我在 If rName.RefersToRange.Parent.Name = "Medical" Then 行中遇到应用程序或对象定义错误
  • with ws的作用是什么? referToRange.Parent 不会用 ws 覆盖吗?
  • 并且 rName 仍然只是加载了 "=_tabName_!$A$15" 而不是 A15 的名称..
  • 也不会是具有工作簿范围的名称的父级是工作簿吗?不是工作表名称?我可能只是尝试走一条不同的路线并删除所有命名范围,以便公式不会从错误的类部分复制
  • @Brian - 代码对我来说完美无缺。我删除了ws 的东西(它是从测试中遗留下来的)。另外,我将.rName.Name 更改为rName.Name.Name ...看看是否有帮助。 Name.RefersToRange.Parent.Name 也是 Worksheet 名称,因为 RefersToRange 位于工作表级别。
猜你喜欢
  • 1970-01-01
  • 2010-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多