如果我有一个Range对象 - 例如,假设它引用名为A1
的工作表上的单元格Book1
。所以我知道调用Address()
会给我一个简单的本地参考:$A$1
。我知道它也可以被称为Address(External:=True)
以获取包含工作簿名称和工作表名称的引用:[Book1]Sheet1!$A$1
。
我想要的是获取包含工作表名称的地址,而不是书名。我真的不想调用Address(External:=True)
并试图用字符串函数自己去除工作簿名称。我可以在范围内拨打电话Sheet1!$A$1
吗?
答案 0 :(得分:49)
我能想到的唯一方法是将工作表名称与单元格引用连接起来,如下所示:
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)
如果你希望它工作,即使工作表名称中有空格或其他有趣的字符。
答案 1 :(得分:13)
Split(cell.address(External:=True), "]")(1)
答案 2 :(得分:4)
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, "]"))
答案 3 :(得分: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”vs“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
答案 4 :(得分: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。
答案 5 :(得分: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
答案 6 :(得分:0)
。地址(,,, TRUE) (显示外部地址,完整地址) : - )
答案 7 :(得分:-1)
为什么不直接返回工作表名称 地址= cell.Worksheet.Name 那么你可以像这样重新连接地址 地址= cell.Worksheet.Name& “!” &安培; cell.Address 强>
答案 8 :(得分:-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
答案 9 :(得分:-1)
让我感到困惑的是一个范围
.Address(False,False,,True)
似乎以格式TheSheet提供!B4:K9
如果没有为什么标准..避免Str functons
可能只需要少于一毫秒并使用153个已使用的电子
约0.3Microsec
RaAdd = mid(RaAdd,instr(raadd,"]")+1)
或
'约1.7微秒
RaAdd = split(radd,"]")(1)
答案 10 :(得分:-2)
[编辑于2009-04-21]
正如Micah指出的那样,这只有在您命名的时候才有效 特殊范围(因此.Name任何人?)是的,哎呀!
[/编辑]
我知道,派对有点晚了,但是如果有其他人在谷歌搜索中抓到这个(就像我刚才那样),你也可以尝试以下方法:
Dim cell as Range
Dim address as String
Set cell = Sheet1.Range("A1")
address = cell.Name
这应该返回完整的地址,例如“= Sheet1!$ A $ 1”。
假设您不需要等号,可以使用替换功能将其剥离:
address = Replace(address, "=", "")