循环遍历当前活动工作表中excel VBA中的所有命名范围

时间:2017-04-05 18:29:55

标签: excel vba excel-vba

您好我希望遍历我的activeworksheet中找到的所有命名范围,然后对它们执行某些操作。但是,我使用了下面的代码,但它似乎没有产生任何东西。此外,如果我可以遍历包含某些单词的命名范围,那将是很好的。例如,我的命名范围被命名为data1,data2,data3等。如果它们包含单词data,我只想处理它们。

For Each nm In Activesheets.Names
    MsgBox "nm.name"
Next nm

2 个答案:

答案 0 :(得分:4)

如果您只想从活动工作表中获取名称,请使用:

Sub Test()
For Each nm In ActiveWorkbook.Names
    If nm.RefersToRange.Parent.Name = ActiveSheet.Name Then MsgBox nm.Name
Next nm
End Sub

^此代码仅返回引用活动工作表上的范围的命名范围。

nm.RefersToRange.Parent将返回与范围相关联的工作表。

然后,我们可以使用.Name检索其名称,并将其与ActiveWorksheet名称进行比较。

在这里,您可以看到Sheet4上有2个命名范围,Sheet3上有1个

当我运行此代码时,它只返回MyName1MyName2 - 它不包含MyName3,因为它不在活动工作表上。

Ranges

此宏只会返回ActiveSheetSheet4

上的内容

Names

答案 1 :(得分:2)

此宏将循环遍历工作簿中的所有命名范围。它将上述评论纳入考虑范围,并展示了如何使用特定范围进行操作。

Sub nameLoop()
Dim nm
Dim wb As Workbook
Set wb = ActiveWorkbook
For Each nm In wb.Names
    If InStr(1, nm.Name, "data") Then
        ' Do stuff with the named range.
        Debug.Print nm.Name
    End If
Next nm
End Sub

注意,使用InStr()会在名称中找到 where 。因此,如果您拥有data1datas1myData1,则会为所有这些代码运行“在此处执行此操作”代码。如果您只想使用data 开始,则将InStr()行更改为:If Left(nm.Name,4) = "data" Then

修改:您可以将其与下面@ user1274820建议的If nm.RefersToRange.Parent.Name = ActiveSheet.Name行结合使用。 (只需将If语句包含And运算符)。