【问题标题】:Excel VBA - Get name of table based on cell addressExcel VBA - 根据单元格地址获取表格名称
【发布时间】:2016-06-29 23:37:47
【问题描述】:

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

我的计划是编写代码,将数据验证从我的维护选项卡上的一个表的一行复制到我的工作簿每个选项卡上的单个表(减去我的“TOC”和“数据”选项卡)。每个选项卡都是“模板”工作表的副本(减去“TOC”、“数据”和“模板(维护)”工作表)。工作表“data”、“TEMPLATE”和“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

【问题讨论】:

  • Debug.Print Range("A3").ListObject.Name 如果单元格不是表格的一部分,则会出错
  • 这个问题有点模棱两可:例如如果 Cell ($A$3) 存在于 3 个 Worksheets 中,那么 VBA 函数应该返回哪个名称?顺便说一句,下面给出的解决方案意味着传递范围对象(这意味着父工作表),而不是像问题中所述的单元格地址。最好的问候,
  • 我已更新问题以包含更多上下文,以便获得更清晰的答案。
  • 您的问题仍然模棱两可,因为通过引用 Cell($A$3) 您已经暗示了它所在的工作表,因此您应该已经将该信息作为设置代码引用 Cell( 3 美元)。否则,将我在每个感兴趣的工作表中显示的工作表函数放入 VBA 中引用它(尽管这似乎是一个奇怪的解决方案)。最好的问候,
  • 进一步澄清,我希望我比昨天的紧急工作做得更好,感觉不舒服,不得不赶回家。如果还有什么解释不够清楚,请告诉我。

标签: vba excel


【解决方案1】:

最初的问题有点模棱两可,因此扩展了答案以解决所有相关的用例。

一种可能的替代方法是使用在任何Worksheet Cell(例如$A$3)中输入的WorksheetFormula,然后从 Excel VBA 宏中引用它:

清单 1. 使用单元格公式获取 Excel 工作表 名称

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

公式实质上是从Workbook 完整路径中提取Worksheet Name

或者,您也可以在 VBA 中实现此目的,前提是您在 Worksheet 中传递引用该单元格的 Range 对象,如以下演示示例所示:

清单 2. 测试 Sub 以获取 Excel WorksheetTable Names 单元格“A3”

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

而且,在最简单的形式中,WorksheetName 可以使用以下语句获得(替换清单 3 中的函数中的那个):

清单 4. 获取单元格/范围对象的父级工作表 名称的替代方法

GetWorksheetName = CellRange.Parent.Name

要获取指定Worksheet Cell 的表名,请参考以下清单5 中所示的代码sn-p:

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

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

希望这会有所帮助。

【讨论】:

  • 我不是根据单元格地址查找选项卡名称,而是通过输入单元格地址来查找单元格所属的表的名称。我还进一步提供了更多详细信息,并且(希望)充分说明了我在代码中寻找的帮助。
  • 对于您的清单 2,我正在寻找单元格所在的表的名称,而不是工作表名称。您能否更新您的回复以反映这一点?这对我有很大帮助。
  • 请参阅我的扩展答案来解决您的所有问题。最好的问候,
【解决方案2】:

如果该单元格不是表格的一部分,则尝试获取任何单元格的 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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-13
  • 1970-01-01
  • 1970-01-01
  • 2014-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多