Excel VBA:我可以使用公式命名范围吗?

Excel VBA:我可以使用公式命名范围吗?,vba,excel,Vba,Excel,我的目标是给我刚粘贴的范围命名为我将来能找到的唯一的东西 复制和粘贴的范围来自下拉菜单,因此必须进行修改 Selection.Name.Formula = "=""AddSection_""&SUBSTITUTE('Add Section'!D3,"" "","""")" 如果他们在D3的下拉列表中选择了油炉,则复制并粘贴该部分。应命名为“AddSection_油炉” 这可能吗 我真正喜欢的是,如果我能有一个命名范围,根据之前存在的数量进行更新。例如,上面是“AddSection_Oi

我的目标是给我刚粘贴的范围命名为我将来能找到的唯一的东西

复制和粘贴的范围来自下拉菜单,因此必须进行修改

Selection.Name.Formula = "=""AddSection_""&SUBSTITUTE('Add Section'!D3,"" "","""")"
如果他们在D3的下拉列表中选择了油炉,则复制并粘贴该部分。应命名为“AddSection_油炉”

这可能吗

我真正喜欢的是,如果我能有一个命名范围,根据之前存在的数量进行更新。例如,上面是“AddSection_OilFurnace1”,下一节是“AddSection_GasFurnace2”,依此类推。但我不知道如何或如果这是可能的哈哈。会不会是这样的:

Worksheets("Add Section").ranges.count
Dim myName As String
Dim maxSuffix As Long
Dim n As Name
myName = "AddSection_" & Replace(Worksheets("Add Section").Range("D3").Value, " ", "")
maxSuffix = 0
For Each n In Names
    If Left(n.Name, Len(myName)) = myName Then
        If IsNumeric(Mid(n.Name, Len(myName) + 1)) Then
            If CLng(Mid(n.Name, Len(myName) + 1)) > maxSuffix Then
                maxSuffix = CLng(Mid(n.Name, Len(myName) + 1))
            End If
        End If
    End If
Next
Selection.Name = myName & (maxSuffix + 1)
这有可能吗?它将如何进入我的命名公式


我是VBA的新手,非常感谢您的帮助

我相信你想做的是:

Selection.Name = "AddSection_" &  Replace(Worksheets("Add Section").Range("D3").Value, " ", "")
或者,设置它以确保尚未使用范围名称,可能类似于:

Worksheets("Add Section").ranges.count
Dim myName As String
Dim maxSuffix As Long
Dim n As Name
myName = "AddSection_" & Replace(Worksheets("Add Section").Range("D3").Value, " ", "")
maxSuffix = 0
For Each n In Names
    If Left(n.Name, Len(myName)) = myName Then
        If IsNumeric(Mid(n.Name, Len(myName) + 1)) Then
            If CLng(Mid(n.Name, Len(myName) + 1)) > maxSuffix Then
                maxSuffix = CLng(Mid(n.Name, Len(myName) + 1))
            End If
        End If
    End If
Next
Selection.Name = myName & (maxSuffix + 1)

这仅在以前使用过现有基本名称的情况下增加计数,即
AddSection\u OilFurnace1
,然后
AddSection\u OilFurnace2
,然后可能
AddSection\u Gasnarace1
-它不会变为
AddSection\u OilFurnace1
AddSection\u Gasnarace2
AddSection\u OilFurnace3
-但它可能很有用。

我相信您想做的是:

Selection.Name = "AddSection_" &  Replace(Worksheets("Add Section").Range("D3").Value, " ", "")
或者,设置它以确保尚未使用范围名称,可能类似于:

Worksheets("Add Section").ranges.count
Dim myName As String
Dim maxSuffix As Long
Dim n As Name
myName = "AddSection_" & Replace(Worksheets("Add Section").Range("D3").Value, " ", "")
maxSuffix = 0
For Each n In Names
    If Left(n.Name, Len(myName)) = myName Then
        If IsNumeric(Mid(n.Name, Len(myName) + 1)) Then
            If CLng(Mid(n.Name, Len(myName) + 1)) > maxSuffix Then
                maxSuffix = CLng(Mid(n.Name, Len(myName) + 1))
            End If
        End If
    End If
Next
Selection.Name = myName & (maxSuffix + 1)

这仅在以前使用过现有基本名称的情况下增加计数,即
AddSection\u OilFurnace1
,然后
AddSection\u OilFurnace2
,然后可能
AddSection\u Gasnarace1
-它不会变为
AddSection\u OilFurnace1
AddSection\u Gasnarace2
AddSection\u OilFurnace3
-但可能有用。

我认为YowE3K的方法是正确的。我重构了他的代码,因为我不喜欢
doloop

Sub AddName()

    Dim myNameBase As String
    Dim arr() As String
    Dim maxName As Long
    Dim n As Name
    myNameBase = "AddSection_" & Replace(Worksheets("Add Section").Range("D3").Value, " ", "")

    For Each n In Names
        If n.Name Like myNameBase & "*" Then
            If n.Name = myNameBase Then
                maxName = 1
            ElseIf n.Name Like myNameBase & ".*." Then
                arr = Split(n.Name, ".")
                If arr(UBound(arr) - 1) >= maxName Then maxName = arr(UBound(arr) - 1) + 1
            End If

        End If
    Next
    Selection.Name = myNameBase & IIf(maxName, "." & maxName & ".", "")

End Sub


谢谢你的帮助

我认为YowE3K的方法是正确的。我重构了他的代码,因为我不喜欢
doloop

Sub AddName()

    Dim myNameBase As String
    Dim arr() As String
    Dim maxName As Long
    Dim n As Name
    myNameBase = "AddSection_" & Replace(Worksheets("Add Section").Range("D3").Value, " ", "")

    For Each n In Names
        If n.Name Like myNameBase & "*" Then
            If n.Name = myNameBase Then
                maxName = 1
            ElseIf n.Name Like myNameBase & ".*." Then
                arr = Split(n.Name, ".")
                If arr(UBound(arr) - 1) >= maxName Then maxName = arr(UBound(arr) - 1) + 1
            End If

        End If
    Next
    Selection.Name = myNameBase & IIf(maxName, "." & maxName & ".", "")

End Sub



谢谢你的帮助

您是尝试(动态)更改指向图纸固定区域的名称,还是仅尝试分配由分配时单元格的值确定的名称?公式不能有副作用。它接受输入,计算值,返回结果。答案是否定的。谢谢你的帮助!我正在尝试分配一个名称,该名称由分配时单元格的值决定。您是在尝试(动态)更改指向图纸固定区域的名称,还是仅尝试分配一个名称,该名称由分配时单元格的值决定?公式不会有副作用。它接受输入,计算值,返回结果。答案是否定的。谢谢你的帮助!我正在尝试分配一个名称,该名称由分配时单元格的值决定Nice answer。我希望你不介意我为我的答案重构了你的代码。@ThomasInzina-我的应该在处理
egggcarton
时忽略
egggcarton
(因为
carton…
不是数字),在处理
egggcarton
时应该忽略
egggcarton
(由于
egg…
的前9个字符不是
eggcardon
)。在
egg456
之后,我仍然无法处理
egg
,但我怀疑用户是否会使用以数值结尾的任何东西。哇,你太棒了!非常感谢你和YowE3K!哇…谁会想到这会如此复杂。这只是一种爱好是件好事。无论如何,我想我会ally收到了。再次感谢。回答很好。我希望你不介意我为我的答案重构了你的代码。@ThomasInzina-我的应该在处理
eggcontrol
时忽略
eggcontrol
(因为
carton…
不是数字),并且在处理
eggcontrol
时应该忽略
eggcontrol
(由于
egg…
的前9个字符不是
eggcardon
)。在
egg456
之后,我仍然无法处理
egg
,但我怀疑用户是否会使用以数值结尾的任何东西。哇,你太棒了!非常感谢你和YowE3K!哇…谁会想到这会如此复杂。这只是一种爱好是件好事。无论如何,我想我会ally收到了。再次感谢。这非常有效!谢谢你-我真的很感谢你花时间来帮助我!@Haley YowE3K指出了一个问题。我的最新更新修复了它。这仍然有效,但添加到它上,我以后如何引用此范围?例如,如果我需要清除单元格内容,我当前正在使用选择,但是否存在错误我可以用其他方式引用该范围?我知道它是以代码运行后命名的,但当它运行时,我应该如何引用它?使用
range(“name”)
将引用一个命名范围(例如
range(“AddSection\u test.1”)
。但是当它运行时,我会将一个变量设置为指向
选择
。例如
设置目标=选择。单元格
。从那里只需使用
目标
引用原始的
选择
。这非常有效!谢谢你-我非常感谢你花时间帮助我!@Haley YowE3Kut一个问题。我的最新更新修复了它。这仍然有效,但添加到它之后,我以后如何引用此范围?例如,如果我需要清除单元格内容,我当前正在使用选择,但是否有其他方法可以引用该范围?我知道它是以代码运行后的名称命名的,但在代码运行时,我应该如何引用它?使用
Range(“name”)
将引用一个命名范围(例如
Range(“AddSection\u test.1”)
。但是当它运行时,我会将一个变量设置为指向
选择
。例如
设置