¿Cómo obtengo la dirección de un rango que incluye el nombre de la hoja de trabajo, pero no el nombre del libro, en Excel VBA?

StackOverflow https://stackoverflow.com/questions/131121

  •  02-07-2019
  •  | 
  •  

Pregunta

Si tengo un objeto Range, por ejemplo, digamos que se refiere a la celda A1 en una hoja de trabajo llamada Book1 . Entonces sé que llamar a Address () me dará una referencia local simple: $ A $ 1 . Sé que también se puede llamar como Address (External: = True) para obtener una referencia que incluya el nombre del libro de trabajo y el nombre de la hoja de trabajo: [Book1] Sheet1! $ A $ 1 .

Lo que quiero es obtener una dirección que incluya el nombre de la hoja, pero no el nombre del libro. Realmente no quiero llamar a Address (External: = True) e intentar quitarme el nombre del libro con funciones de cadena. ¿Hay alguna llamada que pueda hacer en el rango para obtener Sheet1! $ A $ 1 ?

¿Fue útil?

Solución

La única forma en que se me ocurre es concatenar el nombre de la hoja de trabajo con la referencia de celda, de la siguiente manera:

Dim cell As Range
Dim cellAddress As String
Set cell = ThisWorkbook.Worksheets(1).Cells(1, 1)
cellAddress = cell.Parent.Name & "!" & cell.Address(External:=False)

EDITAR:

Modificar la última línea a:

cellAddress = "'" & cell.Parent.Name & "'!" & cell.Address(External:=False) 

si desea que funcione, incluso si hay espacios u otros caracteres divertidos en el nombre de la hoja.

Otros consejos

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

Ben tiene razón. Tampoco se me ocurre ninguna forma de hacer esto. Sugeriría el método que Ben recomienda o el siguiente para quitar el nombre del libro de trabajo.

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

La función de hoja de trabajo Address () hace exactamente eso. Como no está disponible a través de Application.WorksheetFunction , se me ocurrió una solución utilizando el método Evaluate () .

Esta solución permite que Excel trate con espacios y otros caracteres divertidos en el nombre de la hoja, lo cual es una buena ventaja sobre las respuestas anteriores.

Ejemplo:

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

devuelve exactamente " Sheet1! $ A $ 1 " ;, con un objeto Range llamado rng que hace referencia a la celda A1 en la hoja de cálculo Sheet1.

Esta solución solo devuelve la dirección de la primera celda de un rango, no la dirección de todo el rango (" Sheet1! $ A $ 1 " vs " Sheet1! $ A $ 1: $ B $ 2 "). Entonces lo uso en una función personalizada:

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

La documentación completa de la función de hoja de trabajo Dirección () está disponible en el sitio web de Office: https://support.office.com/en-us/article/ADDRESS-function-D0C26C0D-3991-446B-8DE4-AB46431D4F89

Encontré que lo siguiente funcionó para mí en una función definida por el usuario que creé. Concatenaba la referencia del rango de celdas y el nombre de la hoja de trabajo como una cadena y luego los usaba en una declaración de evaluación (estaba usando Evaluate en Sumproduct).

Por ejemplo:

Function SumRange(RangeName as range)   

Dim strCellRef, strSheetName, strRngName As String

strCellRef = RangeName.Address                 
strSheetName = RangeName.Worksheet.Name & "!" 
strRngName = strSheetName & strCellRef        

Luego, consulte strRngName en el resto de su código.

Es posible que necesite escribir código que maneje un rango con múltiples áreas, lo que hace esto:

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

.Dirección (,,, VERDADERO)    (Muestra dirección externa, dirección completa)    :-)

¿Por qué no simplemente devolver el nombre de la hoja de trabajo con address = cell.Worksheet.Name entonces puedes concatenar la dirección de nuevo así address = cell.Worksheet.Name & amp; "! " &erio; 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

Por confundido viejo yo un rango

.Dirección (Falso, Falso, Verdadero)

parece dar en formato TheSheet! B4: K9

Si no es así, ¿por qué los criterios ... evitan las funciones Str?

probablemente solo tomará menos un milisegundo y usará 153 electrones ya usados ??

aproximadamente 0.3 Microsec

RaAdd = mid (RaAdd, instr (raadd, "] ") +1)

o

'aproximadamente 1.7 microsec

RaAdd = split (radd, "] ") (1)

[editar el 21/04/2009]

& nbsp; & nbsp; & nbsp; & nbsp; Como señaló Micah, esto solo funciona cuando usted ha nombrado ese
& nbsp; & nbsp; & nbsp; & nbsp; rango particular (de ahí. ¿Nombre a alguien?) Sí, ¡vaya!

[/ edit]

Un poco tarde para la fiesta, lo sé, pero en caso de que alguien más vea esto en una búsqueda de Google (como acabo de hacer), también puede intentar lo siguiente:

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

Esto debería devolver la dirección completa, algo así como " = Sheet1! $ A $ 1 " ;.

Suponiendo que no desea el signo igual, puede quitarlo con una función Reemplazar:

address = Replace(address, "=", "")
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top