VBA,Excel 2010 - 重命名命名范围

时间:2014-01-29 22:09:37

标签: excel vba excel-vba

我有一个包含许多命名范围的工作簿,我需要重命名它们。我用旧名字和新名字传播。

这有效:

    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公式的单元格,该公式根据其他列中包含的其他几条信息创建新的范围名称。

5 个答案:

答案 0 :(得分:2)

重命名总是很痛苦。请尝试以下方法:

Sub Rename()

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

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

End Sub

循环取决于你。 :)如果有帮助,请告诉我们。

答案 1 :(得分:1)

感谢您的投入,全部!我仍然不明白为什么我给的第一个例子有效,第二个例子没有。尽管如此,以下代码似乎正在起作用。我为片段格式不佳道歉。

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

答案 2 :(得分:1)

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

'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

答案 3 :(得分:1)

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

Sub rename_a_range_name()

Dim NewName As Variant

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

End Sub

答案 4 :(得分:1)

长话短说

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

根本原因

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

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

更多解释和发现

我想重命名范围,但有时被忽略,并且有时会出现错误1004 application- or object-defined error-德语:{ {1}}。

让我们说一个具有Anwendungs- oder objektdefinierter Fehler函数,例如:

rename

我发现了以下内容:

  • 如果在某些单元格更新中由某些UDF触发了更新(用户定义的单元格功能),则在某些情况下将忽略,在其他情况下将出现Function rename( nold As String, nnew As String ) As Boolean ThisWorkbook.Names(nold).Name = nnew rename = True End Function 错误
    • 例如将一些1004放入=rename("oldName", "newName")存在的A1
    • 为什么以及何时忽略它或引发错误对我来说是未知的
  • 如果更新是由某些事件触发的,例如 oldName,它将始终被应用

其他副作用

找出所有内容并对其进行调试时,可能会导致cells got locked automagically and thus also causing some 1004 error