我希望能够循环遍历activeworksheet
中所有的命名区域,并对其进行操作。我已经使用了下面的代码,但似乎没有产生任何结果。此外,如果我可以循环遍历包含特定单词的命名区域,那就更好了。例如,我的命名区域被命名为data1、data2、data3等等。如果它们包含单词"data",我只想在它们上面工作。
For Each nm In Activesheets.Names
MsgBox "nm.name"
Next nm
如果你只想从活动工作表中获取名称,请使用以下代码:
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 个命名范围和 1 个在 Sheet3
上。
当我运行此代码时,它仅返回 MyName1
和 MyName2
- 它不包括 MyName3
,因为它不在活动工作表上。
此宏仅返回我的 ActiveSheet
(Sheet4
)上的命名区域。
If
语句中添加类似于 And Right(nm.name, 15) <> "_FilterDatabase"
的内容,因为 Excel 是通过这种方式定义被筛选的列的。(有什么更好的方法来区分您定义的名称和可能在“幕后”使用的其他像这样的东西吗?) - Ben Philipp这个宏将循环遍历工作簿中的所有命名区域。 考虑到上面的注释,它展示了如何在特定范围内执行操作。
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()
将在名称中的任何位置查找“data”。因此,如果您有data1
、datas1
和myData1
,它将为所有这些运行“do stuff here”代码。如果您只想要以data
开头的范围,则将InStr()
行更改为:If Left(nm.Name,4) = "data" Then
编辑:您可以将其与@user1274820建议的If nm.RefersToRange.Parent.Name = ActiveSheet.Name
一起使用。 (只需使If
语句包括一个And
运算符)。_FilterDatabase
名称的.Visible
属性设置为False
。.Visible
属性而不是比较字符串。
msgbox nm.Name
。你现在的消息框上显示的是“nm.name”,对吧? - BruceWayneActiveWorkbook.Names
,并像其他人所说的那样去掉引号。 - user1274820