【问题标题】:Renaming named ranges重命名命名范围
【发布时间】:2020-01-21 23:34:14
【问题描述】:

我有一个包含许多要重命名的命名范围的工作簿。我有一个包含旧名称和新名称的电子表格。

这行得通:

Dim strOldName As String
Dim strNewName As String            

strOldName = rngNamedRanges.Cells(1, 6).Value2
strNewName = strOldName & "_Renamed"

With ActiveWorkbook.Names(strOldName)
    .Name = strNewName
End With

这不是:

Dim strOldName As String
Dim strNewName As String            

strOldName = rngNamedRanges.Cells(1, 6).Value2
strNewName = CStr(rngNamedRanges.Cells(1, 8).Value2)

With ActiveWorkbook.Names(strOldName)
    .Name = strNewName
End With

显然,我在分配 strNewName 时做错了。

我也尝试过使用.text.value 并修剪字符串,所有这些都没有结果。

非工作代码不会产生错误。它只是无法更改名称。

rngNamedRanges.Cells(1,6) 指的是包含纯文本的单元格。
rngNamedRanges.Cells(1,8) 指的是包含CONCATENATE 公式的单元格,该公式根据其他列中包含的其他几条信息创建新的范围名称。

【问题讨论】:

  • rngNamedRanges 变量中有什么内容?你在哪里声明的?
  • 为我工作(在填写了一些缺失的代码之后)
  • rngNamedRanges.Cells(1, 8).Value2的值是多少希望和rngNamedRanges.Cells(1, 6).Value2不一样?
  • @SiddharthRout:真的很有趣。 :P
  • @BK201:我问这个的原因是因为像蒂姆一样,它也适用于我......如果用户没有收到任何错误消息,那么我想到的唯一可能性是他们是一样的。

标签: excel vba


【解决方案1】:

重命名总是很痛苦。请尝试以下操作:

Sub Rename()

    StrOld = "MyRange1"
    StrNew = StrOld & "_Renamed"

    Range(StrOld).Name = StrNew
    With ThisWorkbook
        .Names(StrOld).Delete
    End With

End Sub

循环由您决定。 :) 让我们知道这是否有帮助。

【讨论】:

  • with 子句是 b/c 我实际上正在用它做另一两件事,但为了示例和测试的清晰性,我去掉了额外的内容。
  • 建议的代码很好地清理了命名范围,但这些更改不会延续到工作簿其他地方的公式中。结果导致大量公式现在引用了一个不存在的命名范围。
【解决方案2】:

谢谢大家的意见!我仍然不明白为什么我给出的第一个示例有效而第二个示例无效。尽管如此,以下代码似乎正在运行。我对 sn-p 格式不佳表示歉意。

Dim rngNamedRanges As Range
Dim strOldName As String
Dim strNewName As String
Dim strRefersTo As String

    Set rngNamedRanges = ActiveWorkbook.Worksheets("Named Ranges").Range("A2:K909")

i = 1
Do Until [CONDITION] = ""
    strOldName = CStr(Trim(rngNamedRanges.Cells(i, 6).Value2))
    strNewName = CStr(Trim(rngNamedRanges.Cells(i, 8).Value2))

            strRefersTo = ActiveWorkbook.Names(strOldName).RefersTo

                'Update all the formulas to use the new name.
                For Each ws In Worksheets
                    If ws.Name <> "Named Ranges" Then
                        ws.Cells.Replace What:=strOldName, Replacement:=strNewName, LookAt _
                        :=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
                        ReplaceFormat:=False
                    End If
                Next

            'Delete old name and replace with the new one
            ActiveWorkbook.Names(strOldName).Delete
            ActiveWorkbook.Names.Add strNewName, strRefersTo

        End If

    strOldName = ""
    strNewName = ""

    i = i + 1
Loop

【讨论】:

  • 我会将代码稍微更改为...(1)首先添加新的命名范围(2)更新所有公式(3)删除旧名称。这样,当公式更新发生时,您的公式就不会报错。
【解决方案3】:

这是重命名范围名称的一种非常简单的方法。我从 Excel Macro Mastery 的 Paul Kelly 那里得到了这个。效果很好。

Sub rename_a_range_name()

Dim NewName As Variant

ThisWorkbook.Names("CurrentName").Name = "NewName"

End Sub

【讨论】:

    【解决方案4】:

    我修改了上面的代码来重命名一些名字。关于上面的代码,循环工作表并在公式(等)中查找/替换每个名称......我发现我需要删除每个名称的字符串开头的工作表引用。

    'Update all the formulas to use the new name.
        myStart = InStr(1, strOldName, "!", vbTextCompare) + 1
        myLength = Len(strOldName) - myStart + 1
        strOldNameSHORT = Mid(strOldName, myStart, myLength)
    
        myStart = InStr(1, strNewName, "!", vbTextCompare) + 1
        myLength = Len(strNewName) - myStart + 1
        strNewNameSHORT = Mid(strNewName, myStart, myLength)
    
    For Each ws In Worksheets
        ws.Cells.Replace What:=strOldNameSHORT, Replacement:=strNewNameSHORT,
            LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, 
            SearchFormat:=False, ReplaceFormat:=False
    Next
    

    【讨论】:

      【解决方案5】:

      长话短说

      将更新放入例如工作表更改事件可能会起作用。

      根本原因

      更新UDFs called from cells are not allowed to change things on the sheet。 (我就是这么做的)

      :我猜有某些计算处理阶段,允许或不允许更新名称。

      更多解释和发现

      我想重命名一个范围,但它有时会被忽略并且有时我收到错误 1004application- or object-defined error - 德语:Anwendungs- oder objektdefinierter Fehler)。

      假设有一个像这样的rename 函数:

      Function rename( nold As String, nnew As String ) As Boolean
        ThisWorkbook.Names(nold).Name = nnew
        rename = True
      End Function
      

      我发现了以下内容:

      • 如果更新是由某些 UDF(用户定义的单元格函数)在某些单元格更新时触发的,则会在某些情况下会被忽略,而在其他情况下引发1004 错误
        • 例如将一些 =rename("oldName", "newName") 放入存在 oldNameA1
        • 我不知道为什么以及何时忽略它或引发错误
      • 如果更新是由某些事件触发的,例如Private Sub Worksheet_Change(ByVal Target As Range) 将始终应用

      其他副作用

      在找出这一切并对其进行调试时,可能导致cells got locked automagically and thus also causing some 1004 error

      【讨论】:

      • Excel 行为对我来说很有意义:Excel 公式有点幂等,即您通常可以始终触发重新计算而不更改结果。但是,您的函数不是幂等的,因此不适合作为“常规”Excel 函数。这不会阻止 VBA 代码调用它,但 Excel 确实阻止了它的执行似乎是正确的。您的代码更适合宏。
      猜你喜欢
      • 2016-12-15
      • 1970-01-01
      • 2013-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-05
      相关资源
      最近更新 更多