2008-09-25 12 views
31

Si tengo un objeto Range, por ejemplo, digamos que se refiere a la celda A1 en una hoja de cálculo llamada Book1. Entonces sé que al llamar al Address() obtendré 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.¿Cómo obtengo la dirección de un rango, incluido el nombre de la hoja de trabajo, pero no el nombre del libro, en Excel VBA?

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 al Address(External:=True) y tratar de quitar el nombre del libro de trabajo con funciones de cadena. ¿Hay alguna llamada que pueda hacer en el rango para obtener Sheet1!$A$1?

Respuesta

41

única manera que puedo pensar es concatenar el nombre de la hoja 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) 

EDIT:

Modificar ú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.

+1

Bueno, eso funciona para lo que tengo que hacer. Gracias. Yo modificaría la última línea a: cellAddress = "'" & cell.Parent.Name & "'!" & cell.Address (Externo: = Falso) para que funcione incluso si hay espacios u otros caracteres divertidos en el nombre de la hoja. – Micah

4

Ben tiene razón. Tampoco puedo pensar en ninguna forma de hacer esto. Sugeriría el método que recomienda Ben o lo 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, "]")) 
-2

[edición el 2009-04-21]

        Como Miqueas señaló, esto sólo funciona cuando se tiene con nombre que
        rango determinado (por lo tanto .Nombre alguien?) Sí, oops!

[/ editar]

Un poco tarde a la fiesta, lo sé, pero en caso de cualquier otra persona coge este en una búsqueda de Google (como acabo de hacer), también se podría tratar el 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 quiere que el signo igual, se puede pelar apagado con una función Reemplazar:

address = Replace(address, "=", "") 
+0

Esto no funcionó para mí cuando lo probé. Recibí un error cuando tocó la celda.Nombre. De acuerdo con la ayuda de VBA, la propiedad Name de un objeto Range devuelve un objeto Name, y solo es válida cuando el objeto se refiere a un rango con nombre. – Micah

+0

¡Ack! Tienes toda la razón. De alguna manera, casualmente llamé a ese rango cuando estaba probando. Voy a actualizar mi respuesta en consecuencia :( – TimS

-1

¿Por qué no devolver el nombre de la hoja con la dirección de = cell.Worksheet.Name a continuación, puede concatenar la dirección de nuevo así address = cell.Worksheet.Name & "!" & cell.Address

+0

Creo que Cell.Worksheet.Name solo va a obtener el nombre de ActiveSheet, que no es lo que el OP quería ... Obtiene específicamente una hoja de cálculo numerada ... – FinancialRadDeveloper

3

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

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

Ejemplo:

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

vuelve exactamente "Hoja1 $ A $ 1!", Con un objeto llamado Rangerng refiriéndose la celda A1 de 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 ("Hoja1! $ A $ 1" frente a "Hoja1! $ A $ 1: $ B $ 2"). Así 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 direcciones() está disponible en el sitio web de la Oficina: https://support.office.com/en-us/article/ADDRESS-function-D0C26C0D-3991-446B-8DE4-AB46431D4F89

+0

Care needs to se debe tener en cuenta que el argumento para "Evaluar()" debe tener menos de 255 caracteres. Quizás el límite sea más alto, pero definitivamente hay un límite. Con los nombres de las hojas realmente largos, esto podría fallar inesperadamente. – ja72

-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 
+1

¡Bienvenido a Stack Overflow! publique un bloque de código, explique por qué este código resuelve el problema planteado. Sin una explicación, esta no es una respuesta. – Artemix

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

Opción agradable y concisa. +1 –

+0

Sí, me gusta conceptualmente pero no funcionará como está cuando el nombre de la hoja tiene espacios y, por lo tanto, necesita comillas simples (es decir, "Mi hoja") – Berryl

0

encontré la siguiente trabajado para yo en una función definida por el usuario que creé. Concatené la referencia de rango de celda y el nombre de la hoja de trabajo como una cadena y luego la utilicé en una declaración Evaluar (estaba usando Evaluar en Subproducto).

Por ejemplo:

Function SumRange(RangeName as range) 

Dim strCellRef, strSheetName, strRngName As String 

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

A continuación, consulte strRngName en el resto de su código.

0

Es posible que tenga que escribir el código que se encarga de una gama con múltiples zonas, que esto hace:

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

.Address (,,, TRUE) (Muestra direcciones externa, dirección completa) :-)

+0

El OP claramente indicó que no desea usar '.Address' pero usted está proponiendo usarlo ¿Hay alguna razón para eso? De lo contrario, te sugiero que elimines o edites tu respuesta. – Ralph

-1

para mí una gama confusa

.Address (False, False, True)

parece dar en formato TheSheet de edad ! B4: K9

Si no por qué los criterios .. evitar Str functons

probable que sólo llevará menos de un milisegundo y el uso de 153 electrones que ya se utilizan

aproximadamente 0,3 Microsec

RaAdd = mID (RaAdd, instr (raadd, "]") 1)

o

'alrededor de 1,7 microsegundos

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

Cuestiones relacionadas