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”,其中一个名为rng
的Range
对象引用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, "=", "")