![有没有办法给 Excel 表指定一个工作表范围而不是工作簿范围的名称?](https://linux22.com/image/1246812/%E6%9C%89%E6%B2%A1%E6%9C%89%E5%8A%9E%E6%B3%95%E7%BB%99%20Excel%20%E8%A1%A8%E6%8C%87%E5%AE%9A%E4%B8%80%E4%B8%AA%E5%B7%A5%E4%BD%9C%E8%A1%A8%E8%8C%83%E5%9B%B4%E8%80%8C%E4%B8%8D%E6%98%AF%E5%B7%A5%E4%BD%9C%E7%B0%BF%E8%8C%83%E5%9B%B4%E7%9A%84%E5%90%8D%E7%A7%B0%EF%BC%9F.png)
在 Excel 中创建表时(我使用的是 Excel 2007),您可以为其指定一个名称,该名称显示在“名称管理器”对话框中。但是,该名称具有工作簿范围。我希望有一个名称范围仅限于工作表如果可能的话(就像命名公式/范围一样)。可能吗?
例如,我希望在几个不同的工作表上有一个名为“Notes”的表格。任何给定的表格都只能从它实际所在的工作表中引用,并且我不希望每个工作表都有一个具有不同名称的表格。我还希望当我在“名称管理器”对话框中按范围排序时,能够看到表格名称与范围在该工作表的其他命名公式分组在一起。
答案1
为了完整起见,我很确定我的问题的答案是“否”。
当然,我会不接受这一点,并接受一个表明这是错误的答案,或者一个解释为什么它是正确的答案。
答案2
这可能是一种有用的解决方法:
'Given a worksheet name and a table(ListObject)name "prefix," return the actual name of the ListObject on the sheet.
'For example, if a worksheet containing a table called "ConfigTbl" is duplicated, it will get a name
'like "ConfigTbl3279" on the worksheet copy.
'This is a workaround for the fact that Tables are worksheet-level objects;
'Excel doesn't have local/worksheet-level tables.
'If you pass in one of the "Special Item" qualifiers, then the function will return the specified
'range as an object (e.g., "[#All]" for the whole table or "[#Headers]" for the column names).
'Returns #N/A if error.
Public Function tableName(wksht As String, tblName As String, Optional specialItem)
Dim lObj As ListObject
On Error GoTo ErrHandler
tblName = UCase(tblName)
For Each lObj In Worksheets(wksht).ListObjects
If (UCase(Left(lObj.Name, Len(tblName))) = tblName) Then
tableName = lObj.Name
If Not (IsMissing(specialItem)) Then Set tableName = Evaluate(tableName & specialItem)
Exit Function
End If
Next lObj
ErrHandler:
tableName = CVErr(xlErrNA)
End Function
答案3
我也遇到过同样的问题。在我的 VBA 代码中,我只能查看活动工作表的对象并检查前 6 个字母(当我复制包含表格的工作表时,Excel 2007 只会在表格名称末尾附加一个数字)。
' First get table names on this worksheet (copying worksheet changes names of tables)
Dim oSh As Worksheet
Dim oLo As ListObject
Set oSh = ActiveSheet
For Each oLo In oSh.ListObjects
Application.Goto oLo.Range
'MsgBox ("Table found: " & oLo.Name & ", " & oLo.Range.Address)
' pathsTable =
Select Case Left(oLo.Name, 6)
Case "tblDec"
decTable = oLo.Name
Case "tblPat"
pathTable = oLo.Name
Case "tblPro"
processTable = oLo.Name
End Select
Next
然后在我的其余代码中,我使用新名称:decTable、pathTable 和 processTable。
一个简单的解决方法是创建具有引用表的本地范围的名称。因此,每个表将有两个名称 - 一个具有全局范围,一个仅具有当前工作表范围。(在“定义名称”对话框中,将新范围命名为“Notes”,将范围更改为工作表,将“引用”更改为 =Table1(或 Excel 命名的表))。在第一个工作表上执行此操作,然后复制工作表。表将具有相同的名称,但范围仅限于该工作表。缺点是使用重复名称时不能使用正常的表引用,例如“=average(Names[Column1])”不起作用。:( 如果您只使用表中的一小部分列,则可以为要在其他地方使用的每个列创建一个名称,“myColumn1”引用“=Table1[Column1]”。