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

前端 未结 11 1416
眼角桃花
眼角桃花 2020-12-25 10:34

If I have a Range object--for example, let\'s say it refers to cell A1 on a worksheet called Book1. So I know that calling Address()

相关标签:
11条回答
  • 2020-12-25 11:08

    Ben is right. I also can't think of any way to do this. I'd suggest either the method Ben recommends, or the following to strip the Workbook name off.

    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, "]"))
    
    0 讨论(0)
  • 2020-12-25 11:08

    The Address() worksheet function does exactly that. As it's not available through Application.WorksheetFunction, I came up with a solution using the Evaluate() method.

    This solution let Excel deals with spaces and other funny characters in the sheet name, which is a nice advantage over the previous answers.

    Example:

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

    returns exactly "Sheet1!$A$1", with a Range object named rng referring the A1 cell in the Sheet1 worksheet.

    This solution returns only the address of the first cell of a range, not the address of the whole range ("Sheet1!$A$1" vs "Sheet1!$A$1:$B$2"). So I use it in a custom function:

    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
    

    The full documentation of the Address() worksheet function is available on the Office website: https://support.office.com/en-us/article/ADDRESS-function-D0C26C0D-3991-446B-8DE4-AB46431D4F89

    0 讨论(0)
  • 2020-12-25 11:08
    rngYourRange.Address(,,,TRUE)
    

    Shows External Address, Full Address

    0 讨论(0)
  • 2020-12-25 11:13

    You may need to write code that handles a range with multiple areas, which this does:

    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
    
    0 讨论(0)
  • 2020-12-25 11:20
    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
    
    0 讨论(0)
提交回复
热议问题