如何在Excel VBA中获得包含工作表名称而不是工作簿名称的范围地址?

时间:2020-03-06 14:42:04  来源:igfitidea点击:

如果我有一个Range对象,例如,假设它引用了名为Book1的工作表上的单元格A1. 因此,我知道调用Address()将为我提供一个简单的本地引用:$ A $ 1。我知道也可以将其称为" Address(External:= True)",以获得包含工作簿名称和工作表名称的引用:" [Book1] Sheet1!$ A $ 1"。

我要获取的地址包括工作表名称,而不是书名。我真的不想调用Address(External:= True)并尝试使用字符串函数自己删除工作簿名称。我可以在该范围内拨打任何电话以获得Sheet1!$ A $ 1吗?

解决方案

我能想到的唯一方法是将工作表名称与单元格引用连接起来,如下所示:

Dim cell As Range
Dim cellAddress As String
Set cell = ThisWorkbook.Worksheets(1).Cells(1, 1)
cellAddress = cell.Parent.Name & "!" & cell.Address(External:=False)

编辑:

将最后一行修改为:

cellAddress = "'" & cell.Parent.Name & "'!" & cell.Address(External:=False)

即使我们在工作表名称中包含空格或者其他有趣字符的情况下也希望它正常工作。

本是对的。我也想不出任何办法。我建议使用Ben建议的方法,或者使用以下方法删除工作簿名称。

Dim cell As Range
Dim address As String
Set cell = Worksheets(1).Cells.Range("A1")
address = cell.address(External:=True)
address = Right(address, Len(address) - InStr(1, address, "]"))

[于2009-04-21编辑]

正如米迦指出的那样,这仅在我们命名时才有效
特定范围(因此,给任何人命名?)是的,哎呀!

[/编辑]

我知道聚会晚了一点,但是如果其他人在Google搜索中发现了这个问题(就像我刚才所做的那样),我们还可以尝试以下操作:

Dim cell as Range
Dim address as String
Set cell = Sheet1.Range("A1")
address = cell.Name

这应该返回完整的地址,例如" = Sheet1!$ A $ 1"。

假设我们不希望使用等号,则可以使用Replace函数将其删除:

address = Replace(address, "=", "")

为什么不只返回工作表名称
地址= cell.Worksheet.Name
那么我们可以像这样将地址重新连接起来
地址= cell.Worksheet.Name&"!" &cell.Address

Address()工作表函数正是这样做的。由于无法通过Application.WorksheetFunction获得,因此我想出了一种使用Evaluate()方法的解决方案。

该解决方案使Excel可以处理工作表名称中的空格和其他有趣的字符,这是对以前答案的一个很好的优点。

例子:

Evaluate("ADDRESS(" & rng.Row & "," & rng.Column & ",1,1,""" & _
    rng.Worksheet.Name & """)")

精确地返回" Sheet1!$ A $ 1",其中一个名为" rng"的" Range"对象引用Sheet1工作表中的A1单元格。

此解决方案仅返回范围的第一个单元格的地址,而不返回整个范围的地址(" Sheet1!$ A $ 1"与" Sheet1!$ A $ 1:$ B $ 2")。所以我在自定义函数中使用它:

Public Function AddressEx(rng As Range) As String

    Dim strTmp As String

    strTmp = Evaluate("ADDRESS(" & rng.Row & "," & _
        rng.Column & ",1,1,""" & rng.Worksheet.Name & """)")

    If (rng.Count > 1) Then

        strTmp = strTmp & ":" & rng.Cells(rng.Count) _
            .Address(RowAbsolute:=True, ColumnAbsolute:=True)

    End If

    AddressEx = strTmp

End Function

Office网站上提供了Address()工作表功能的完整文档:https://support.office.com/en-us/article/ADDRESS-function-D0C26C0D-3991-446B-8DE4-AB46431D4F89