40

如果我有一个 Range 对象——例如,假设它指的A1是工作表上名为Book1. 所以我知道打电话Address() 会给我一个简单的本地参考:$A$1. 我知道它也可以被称为Address(External:=True)获取参考,包括工作簿名称和工作表名称:[Book1]Sheet1!$A$1.

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

4

11 回答 11

62

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

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) 

如果您希望它在工作表名称中有空格或其他有趣字符的情况下也能正常工作。

于 2008-09-25T02:23:32.290 回答
16
Split(cell.address(External:=True), "]")(1)
于 2013-07-30T18:43:56.083 回答
3

本是对的。我也想不出任何办法来做到这一点。我建议使用 Ben 推荐的方法或以下方法来去除 Workbook 名称。

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, "]"))
于 2008-09-25T02:36:11.323 回答
3

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

这个解决方案让 Excel 处理工作表名称中的空格和其他有趣的字符,这比以前的答案有一个很好的优势。

例子:

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

准确返回“Sheet1!$A$1”,其中一个Range对象命名rng为 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

Address() 工作表函数的完整文档可在 Office 网站上找到:https: //support.office.com/en-us/article/ADDRESS-function-D0C26C0D-3991-446B-8DE4-AB46431D4F89

于 2009-08-12T13:08:47.293 回答
0

我发现以下内容在我创建的用户定义函数中对我有用。我将单元格区域引用和工作表名称连接为字符串,然后在 Evaluate 语句中使用(我在 Sumproduct 上使用 Evaluate)。

例如:

Function SumRange(RangeName as range)   

Dim strCellRef, strSheetName, strRngName As String

strCellRef = RangeName.Address                 
strSheetName = RangeName.Worksheet.Name & "!" 
strRngName = strSheetName & strCellRef        

然后在其余代码中引用 strRngName。

于 2014-06-09T00:02:03.810 回答
0

您可能需要编写代码来处理具有多个区域的范围,这样做:

Public Function GetAddressWithSheetname(Range As Range, Optional blnBuildAddressForNamedRangeValue As Boolean = False) As String

    Const Seperator As String = ","

    Dim WorksheetName As String
    Dim TheAddress As String
    Dim Areas As Areas
    Dim Area As Range

    WorksheetName = "'" & Range.Worksheet.Name & "'"

    For Each Area In Range.Areas
'           ='Sheet 1'!$H$8:$H$15,'Sheet 1'!$C$12:$J$12
        TheAddress = TheAddress & WorksheetName & "!" & Area.Address(External:=False) & Seperator

    Next Area

    GetAddressWithSheetname = Left(TheAddress, Len(TheAddress) - Len(Seperator))

    If blnBuildAddressForNamedRangeValue Then
        GetAddressWithSheetname = "=" & GetAddressWithSheetname
    End If

End Function
于 2015-01-19T13:29:42.220 回答
0
rngYourRange.Address(,,,TRUE)

显示外部地址、完整地址

于 2016-07-13T07:12:02.020 回答
-1

为什么不只返回带有 地址 = cell.Worksheet.Name的工作表名称, 然后您可以像这样将地址连接回来 address = cell.Worksheet.Name & "!" & 单元格.地址

于 2009-07-07T00:05:28.933 回答
-1
Dim rg As Range
Set rg = Range("A1:E10")
Dim i As Integer
For i = 1 To rg.Rows.Count

    For j = 1 To rg.Columns.Count
    rg.Cells(i, j).Value = rg.Cells(i, j).Address(False, False)

    Next
Next
于 2011-03-25T11:48:57.807 回答
-1

对于困惑的老我来说,一个范围

.Address(False, False, , True)

seems to give in format TheSheet!B4:K9

If it does not why the criteria .. avoid Str functons

will probably only take less a millisecond and use 153 already used electrons

about 0.3 Microsec

RaAdd=mid(RaAdd,instr(raadd,"]") +1)

or

'about 1.7 microsec

RaAdd= split(radd,"]")(1)

于 2017-01-13T05:33:21.077 回答
-2

[2009-04-21 编辑]

    正如 Micah 指出的那样,这仅在您命名了该
    特定范围时才有效(因此。命名任何人?)是的,哎呀!

[/编辑]

我知道聚会有点晚了,但如果其他人在谷歌搜索中发现了这个(就像我刚刚做的那样),你也可以尝试以下方法:

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

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

假设您不想要等号,您可以使用 Replace 函数将其删除:

address = Replace(address, "=", "")
于 2009-03-27T04:58:40.717 回答