¿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?
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
?
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, "=", "")