繁体   English   中英

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

[英]How do I get a range's address including the worksheet name, but not the workbook name, in Excel VBA?

如果我有一个 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) 

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

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

本是对的。 我也想不出有什么方法可以做到这一点。 我建议使用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, "]"))

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

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

例:

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

返回“Sheet1!$ A $ 1”,其中一个名为rngRange对象引用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

我发现以下在我创建的用户定义函数中为我工作。 我将单元格范围引用和工作表名称连接成一个字符串,然后在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)(显示外部地址,完整地址):-)

我发现执行此操作的最佳方法是使用以下代码:

Dim SelectedCell As String

'This message Box allows you to select any cell on any sheet and it will return it in the format of =worksheetname!$A$X" where X is any number.

SelectedCell = Application.InputBox("Select a Cell on ANY sheet in your workbook", "Bookmark", Type:=8).Address(External:=True)

SelectedCell = "=" & "'" & Right(SelectedCell, Len(SelectedCell) - Len("[" & ActiveWorkbook.Name & "]") - 1)

'Be sure to modify Sheet1.Cells(1,1) with the Sheet and cell you want to use as the destination. I'd recommend using the Sheets VBA name.

Sheet1.Cells(1, 1).Value = SelectedCell

怎么运行的;

通过在出现消息框时单击所需的单元格。 来自“Address(External:=True)”(即 ['[Code Sheet.xlsb]Settings'.$A$1)的字符串随后被修改以删除工作表的全名([Code Sheet.xlsb])。

使用前面的例子,它通过获取全长的“Len”来做到这一点;

[Code Sheet.xlsb]Settings'.$A$1 减去([Code Sheet.xlsb] -1)的Len。 留给您“设置”!$A$1。

 SelectedCell = "=" & "'" & Right(SelectedCell, Len(SelectedCell) - Len("[" & ActiveWorkbook.Name & "]") - 1)

代码然后是它和“='”以确保它将被视为一个公式 (='Settings'.$A$1)。

我不确定它是否仅在 IOS 上的 Excel 上,但出于某种原因,如果您以除“=”和“'”之外的任何其他方式添加“='”,您将收到错误代码,如下所示。

SelectedCell = "=" & "'" & Right....

从这里开始,您所需要做的就是在您想要新公式的工作表和单元格中制作程序。

Sheet1.Cells(1, 1).Value = SelectedCell

通过打开一个新的工作簿,上面的完整代码将按原样运行。

此代码特别有用,因为更改工作簿的名称或您在消息框中选择的工作表的名称不会在以后导致错误。

感谢论坛中的每个人,今天之前我不知道 External=True 是一回事,它会使我的编码更容易。 希望有一天这也可以帮助某人。

为什么不直接返回带有address = cell.Worksheet.Name的工作表名称,然后你可以重新连接地址,就像这个地址= cell.Worksheet.Name&“!” &cell.Address

对于困惑的老我一个范围

.Address(False,False,True)

似乎以格式TheSheet给出!B4:K9

如果它没有为什么标准..避免Str functons

可能只需要一个毫秒,并使用153个已经使用过的电子

约0.3微升

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

要么

'约1.7微秒

RaAdd = split(radd,“]”)(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

[编辑于2009-04-21]

[/编辑]

我知道,派对有点晚了,但是如果有其他人在谷歌搜索中抓到这个(就像我刚才那样),你也可以尝试以下方法:

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

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

假设您不需要等号,可以使用Replace功能将其剥离:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM