如何获取Excel名称管理器中指定单元格的定义名称
VBA类模块持久化:获取命名区域名称与查找可用行
问题背景与需求
- 开发可跨多项目复用、极简配置的类模块,依赖名为
_SYS的隐藏工作表存储类属性,实现跨会话持久化。 - 计划通过
WorkbookObj.Names.Add动态创建命名区域,希望直接通过Range属性设置/获取名称,避免遍历整个Names集合。 - 核心目标:遍历
_SYS表某一列的单元格,判断单元格关联的命名区域是否以下划线_开头(如_Name1、_Name2),找到第一个未被此类命名占用的单元格(即下一个可用行)。
遇到的问题
原本以为Range.Name可以直接返回区域的命名,但实际它返回的是扩展地址字符串,无法获取已创建的命名区域名称。现有尝试的核心代码无法正确运行:
Private Function NextUnnamedCell() As Range Dim Cell As Range For Each Cell In Sheet1.Columns(4).Cells If Not Left(Cell.Name, 1) = "_" Then Set NextUnnamedCell = Cell Exit Function End If Next Cell End Function
解决方案
1. 正确获取单元格的命名区域名称
要获取单元格关联的命名名称,需要通过Range.Name.Name属性(两层.Name):
- 第一层
Cell.Name返回的是Name对象,而非名称字符串; - 第二层
.Name才是该命名区域的名称文本。
同时需要处理单元格未被命名的情况,避免运行时错误。
2. 优化后的NextUnnamedCell函数
修改后的函数可正确判断单元格是否有以下划线开头的命名,并高效找到第一个可用单元格:
Private Function NextUnnamedCell() As Range Dim cell As Range Dim targetCol As Range ' 定位到_SYS表第4列的已使用范围,避免遍历整列浪费资源 With ThisWorkbook.Worksheets("_SYS") Set targetCol = .Columns(4).Resize(.Cells(.Rows.Count, 4).End(xlUp).Row) End With For Each cell In targetCol.Cells Dim nameStr As String ' 捕获未命名单元格的错误,避免程序崩溃 On Error Resume Next nameStr = cell.Name.Name On Error GoTo 0 ' 未命名 或 命名不以_开头,即为目标单元格 If nameStr = "" Or Left(nameStr, 1) <> "_" Then Set NextUnnamedCell = cell Exit Function End If Next cell ' 若已使用区域全被命名,返回下一个空单元格 Set NextUnnamedCell = ThisWorkbook.Worksheets("_SYS").Cells(targetCol.Rows.Count + 1, 4) End Function
3. 直接设置Range的命名(无需遍历Names集合)
实际上通过Range.Name = "命名名称"可以直接给单元格/区域设置命名,本质是自动调用Names集合的Add方法,无需手动遍历:
' 给_SYS表第4列第3行单元格设置下划线开头的命名 ThisWorkbook.Worksheets("_SYS").Cells(3,4).Name = "_Name3"
内容的提问来源于stack exchange,提问作者K.Dᴀᴠɪs
相关产品推荐
相关产品推荐

