Excel VBA – 根据单元格地址获取表格的名称

我正在使用Excel,并希望根据单元格地址(例如A3)获取表格的名称,此单元格不会移动。 我如何去在Excel的VBA中说明这一点?

我的计划是让代码将数据validation从“维护”选项卡上的一行表中的一行复制到工作簿的每个选项卡上的单个表(不包括我的“TOC”和“数据”选项卡)。 每个选项卡都是“TEMPLATE”工作表的副本(减去“TOC”,“data”和“TEMPLATE(Maint。)”工作表)。 工作表“数据”,“模板”和“模板(维护)”可能隐藏,也可能不隐藏。

我在“Copy_Data_Validations”子文件中的代码如下所示:

Dim TotalSheets As Integer Dim p As Integer Dim iAnswer As VbMsgBoxResult With Application .DisplayAlerts = False .ScreenUpdating = False End With ' ' Move sheet "TOC" to the begining of the workbook. ' Sheets("TOC").Move Before:=Sheets(1) ' ' Move sheet "data" to be the second sheet in the workbook. ' Sheets("data").Move Before:=Sheets(2) iAnswer = MsgBox("You are about to copy data validations!", vbOKCancel + vbExclamation _ + vbDefaultButton2 + vbMsgBoxSetForeground, "Copying Data Valadations") For TotalSheets = 1 To Sheets.Count For p = 3 To Sheets.Count - 2 ' ' If the answer is Yes, then copy data validations from "TEMPLATE (Maint.) to all other. ' sheets minus the "TOC" sheet and the "data" sheet. ' If iAnswer = vbYes Then If UCase$(Sheets(p).Name) <> "TOC" And UCase$(Sheets(p).Name) <> "data" Then ' This chunk of code should copy only the data validations ' of "Table1_1" (A4:AO4) from the maintenance tab to all ' rows of a single table on each worksheet (minus the ' "TOC", "data", & the "TEMPLATE (Maint.)" worksheets. ' This is the section of code I am looking for unless ' someone has something better they can come up with. Selection.PasteSpecial Paste:=xlPasteValidation, _ Operation:=xlNone, SkipBlanks:=False, Transpose:=False End If ' ' If the answer is Cancel, then cancels. ' ElseIf iAnswer = vbCancel Then ' Add an exit here. End If With Application .DisplayAlerts = True .ScreenUpdating = True End With 

尝试获取任何单元格的ListObject的名称将导致错误,如果该单元格不是表的一部分。

 Option Explicit Function CellInTable(thisCell As Range) As String Dim tableName As String tableName = "" On Error Resume Next tableName = thisCell.ListObject.Name CellInTable = tableName End Function 

原来的问题有点模棱两可,因此答案被扩展到处理所有相关的用例。

一种可能的select是使用在任何Worksheet Cell中input的下面的Worksheet Formula (例如$A$3 ),然后从Excel VBAmacros中引用它:

清单1.使用Cell Formula获取Excel 工作表 名称

 =MID(CELL("filename",A3),FIND("]",CELL("filename",A3))+1,255) 

该公式实质上从Workbook完整path中提取Worksheet Name

或者,您可以在VBA中实现这一点,只要您在Worksheet引用该单元格的Range对象,如下面的演示示例所示:

清单2.testing小组获取单元格“A3”的Excel 工作表

 Option Explicit 'Cell "A3" under the test Sub GetWorksheetAndTableName() Dim myCell As Range Set myCell = Range("$A$3") Debug.Print "Worksheet Name: " & GetWorksheetName(myCell) Debug.Print "Table Name: " & GetTableName(myCell) End Sub 

清单3.获取单元格的工作表 名称的函数

 'get Worksheet Name from Range object Function GetWorksheetName(CellRange As Range) As String On Error Resume Next GetWorksheetName = Split(Split(CellRange.Address(External:=True), "]")(1), "!")(0) End Function 

而且,以最简单的forms,可以使用以下语句(replace清单3中显示的函数中的那个语句)获得Worksheet Name

清单4.获取Cell / Range对象的父级工作表 名称的替代方法

 GetWorksheetName = CellRange.Parent.Name 

为了获得指定Worksheet Cell的表名,请参考下面清单5中的代码片段:

清单5.获取工作表单元格的表名

 Function GetTableName(CellRange As Range) As String If (CellRange.ListObject Is Nothing) Then GetTableName = "" Else GetTableName = CellRange.ListObject.Name End If End Function 

希望这可能有帮助。