Excel VBA中如何获取范围的地址,包括工作表名称,但不包括工作簿名称?

如果我有一个Range对象 – 例如,让我们说它引用名为Book1的工作表上的单元格A1 。 所以我知道调用Address()会给我一个简单的本地引用: $A$1 。 我知道它也可以被称为Address(External:=True)来获取包括工作簿名称和工作表名称的参考: [Book1]Sheet1!$A$1

我想要的是得到一个地址,包括表名,但不是书名。 我真的不想调用Address(External:=True)并尝试用string函数自己去除工作簿名称。 是否有任何电话我可以在范围内获得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) 

如果您希望它工作,即使表格名称中有空格或其他有趣的字符。

 Split(cell.address(External:=True), "]")(1) 

本是对的。 我也想不出有什么办法做到这一点。 我会build议方法本build议,或以下剥离工作簿名称。

 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, "]")) 

Address()工作表函数就是这样做的。 由于不能通过Application.WorksheetFunction ,我想出了一个使用Evaluate()方法的解决scheme。

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

例:

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

完全返回“Sheet1!$ A $ 1”,其中一个名为rngRange对象引用Sheet1工作表中的A1单元格。

此解决scheme只返回范围的第一个单元格的地址,而不是整个范围(“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

我发现以下在我创build的用户定义函数中为我工作。 我将单元格区域引用和工作表名称串联起来,然后用在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。

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

 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 

.Address(,,, TRUE)(显示外部地址,完整地址):-)

为了让我困惑的老一辈

。地址(假,假,真)

似乎给格式TheSheet!B4:K9

如果这不是为什么的标准..避免Str functons

可能只需要less一毫秒,而且已经使用了153个电子

约0.3微米

RaAdd = mid(RaAdd,instr(raadd,“]”)+1)

要么

“大约1.7微秒

RaAdd = split(radd,“]”)(1)

为什么不只是返回工作表名称与地址= cell.Worksheet.Name然后你可以连接地址重新像这样address = cell.Worksheet.Name&“!” &cell.Address

 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 

[编辑于2009-04-21]

正如Micah指出的那样,只有当你命名的时候才有效
特定的范围(因此,任何人?)是啊,哎呀!

[/编辑]

我知道,晚会有点晚,但是如果有其他人在谷歌search中捕获到这个(就像我刚刚做的那样),也可以尝试以下方法:

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

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

假设你不想要等号,你可以用Replace函数去掉它:

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