variable valor una ultima tomar seleccionar rango posicion obtener macro hoja hasta desde datos con celda asignar activa excel vba excel-vba

valor - ¿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?



seleccionar rango variable vba (11)

¿Por qué no simplemente devuelve el nombre de la hoja de cálculo con la dirección = cell.Worksheet.Name luego puede concatenar la dirección de nuevo como esta dirección = cell.Worksheet.Name & "!" y cell.Address

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 al llamar a 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 .

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) y trato 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 ?


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


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


Encontré que lo siguiente funcionó para mí 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

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


Es posible que necesite escribir código que maneje un rango con áreas múltiples, 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


La única forma en que puedo pensar 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 para:

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.


La función de hoja de cálculo de 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 espacios y otros personajes 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 "Hoja1! $ A $ 1", con un objeto Range llamado rng referencia a la celda A1 en la hoja de trabajo Hoja1.

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"). 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 cálculo de Dirección () está disponible en el sitio web de Office: https://support.office.com/en-us/article/ADDRESS-function-D0C26C0D-3991-446B-8DE4-AB46431D4F89


Para confundirme un rango

.Address (False, False, True)

parece dar en formato TheSheet! B4: K9

Si no es así, ¿por qué los criterios ... evite los funcionamientos Str?

probablemente solo tome menos un milisegundo y use 153 electrones ya usados

alrededor de 0.3 Microsec

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

o

''alrededor de 1.7 microsec

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


[editar el 2009-04-21]

Como señaló Micah, esto solo funciona cuando lo has nombrado
rango particular (de ahí. ¿alguien?) Sí, ¡uy!

[/editar]

Un poco tarde para la fiesta, lo sé, pero en caso de que alguien más lo capte en una búsqueda en Google (como acabo de hacer), también podría 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 la función Reemplazar:

address = Replace(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


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