Obtener el nombre de un rango en Excel VBA

Estoy trabajando con una macro que copia varios datos desde varias hojas a un formulario, al copiar el dato de la hoja tengo el tirulo definido con el nombre del rango donde se debe pegar, pero la rutina range("X"). Name no devuelve el nombre del rango si no que me entrega el nombre de la hoja más el rango de la celda.

Ejemplo de la macro.

Dato = Range(Origen).Offset(Offs + j - 1, i).Value

nombre = Range(Origen).Offset(Offs + j - 1, i).name

así puedo abrir el libro nuevo y pegar el valor en el rango con el nombre actual.

range("nombre").value = Dato

Y así con cada rango en la hoja

Existe otra forma de obtener el nombre definido en el rango para poder trabajarlo en el otro libro.

3

3 Respuestas

181.575 pts. Si de mis mayores gustos, mis disgustos han nacido,...

Primero así no se declara un name en este ejemplo el name se llama hola y como puedes ver aparece en la lista desplegable hay varias formas de declara el name y son muy útiles a la hora de programar para traer datos de otras páginas dentro del mismo libro o copiar o mover solo ciertas columnas, filas o datos o simplemente hacer operaciones entre diversos names.

la forma en que se declaran los names es la siguiente

Sub nombrar_rangp()
'estas son las opciones para cargar un name
Range("a1").Name = "hola"
Set datos = Range("a1")
datos.Name = "hola"
Range("a1").Resize(1, 3).Name = "hola"
Range("a1").Offset(1, 1).Name = "hola"
Names.Add "hola", Range("a1")
Range("a1:b20").Name = "hola2"
Set datos = Range("a1:b20")
datos.Name = "hola2"
Range("a1").Resize(2, 20).Name = "hola2"
Names.Add "hola", Range("a1:b20")
'y esta es la opcion para cargarlo
Set x = Range("hola")
y=range("hola")
y=range("hola").cells(1,2) 'en caso de tener una area de varias columnas
End Sub
4.539.375 pts. Sancho, si los perros ladran ...

Haber si entendí.

En el libro-origen tienes varios nombres. En cada nombre tienes un dato. Ejemplo:

Libro: origen

Nombre                Dato

"RutTitular"           30.686.957-X

"NombreTitular"   Manuel Zamora

Lo que quieres es tomar cada dato de esos nombres y llevarlo al libro2; en el libro2 tienes los mismos nombres, pueden estar en cualquier hoja y en cualquier celda.

Si es correcto lo anterior. Utiliza la siguiente macro:


Sub nombres()
'Por.Dante Amor
    '
    Set l1 = ThisWorkbook                               'libro origen con la macro y con los nombres
    Set l2 = Workbooks("Libro2.xlsx")                   'libro destino, deberá estar abierto
    For Each nombre In l1.Names                         'para cada nombre en el libro origen
        campo = nombre.Name                             'devuelve el nombre-rango
        hoja_1 = nombre.RefersToRange.Worksheet.Name    'devuelve nombre de la hoja del nombre-rango
        dato = l1.Sheets(hoja_1).Range(campo).Value     'devuleve el valor del nombre-rango
        Set nombre2 = l2.Names(campo)                   'establece en nombre2 el nombre-rango del libro2
        hoja_2 = nombre2.RefersToRange.Worksheet.Name   'devuelve el nombre de la hoja del nombre-rango del libro2
        'pone en el libro2, en la hoja y en la celda del nombre-rango
        l2.Sheets(hoja_2).Range(campo).Value = dato
    Next
    MsgBox "Fin"
End Sub

Lo que hace la macro es leer todos los nombres que tienes en el libro origen. Toma el dato de cada uno de los nombres. Después va al libro2 y busca el nombre correspondiente en el libro2, obtiene la hoja y entonces pone el dato en el libro2, hoja y celda destino según el nombre.

.

'S aludos. Dante Amor. Recuerda valorar la respuesta. G racias

.

Avísame cualquier duda

.

¡Gracias!

Es en parte lo que necesito el problema es que se torna muy lento porque tengo muchas hojas con nombres, pero igual me sirve para trabajar en lo que necesito.

Gracias por la ayuda.

236.125 pts. Programador - Administrador

No me queda claro lo que tienes. Si tienes un rango que se llama, como en tu ejemplo, "X" ¿cuál es el sentido de obtener el nombre si ya lo sabes?

Abraham Valencia

Hola gracias por el interés, te comento lo que sucede es que este valor va cambiando según el informe que debo leer por lo que necesito saber el nombre en cada lectura para así copiar y pegar esa información en cada formulario que voy abriendo.

ejemplo tengo las fila a con los campos nombre, rut, fecha, (el nombre de rango es similar), luego en otra hoja puede ser nombre, fecha, sexo, y son varias hojas por lo que no quiero hacer una variable con cada nombre.

el problema se me da aca:

Dato = Range("RutTitular").Offset(j, i).Value
Campo = Range("RutTitular").Offset(1, i).Name 'Aca debo obtener el nombre del campo
Windows(Formulario).Activate
Range(Campo).Value = Dato 'para pegarlo en el otro libro con el mismo nombre de campo

copio el codigo completo

Sub CrearEstosFormularios(Pagina)
Sheets(Pagina).Select
If Range("NombreTitular").Offset(1, 0).Value <> "" Then
AbrirFormulario
actual = ActiveWorkbook.Name
Windows(FormularioWEB).Activate
Formulario = Range("NombreFormulario").Value
N = Range("RutTitular").End(xlDown).Row - Range("RutTitular").Row
For j = 1 To N
i = 1
While Range("RutTitular").Offset(0, i).Value <> ""
Dato = Range("RutTitular").Offset(j, i).Value
Campo = Range("RutTitular").Offset(1, i).Name
Windows(Formulario).Activate
Range(Campo).Value = Dato 
' Windows (Actual)
i = i + 1
Wend
' GrabarFormulario
Next
' CerrarFormulario
End If
End Sub

Quizá si pones un ejemplo se pueda entenderte mejor. Detallado y sin tratar de abarcar todo. Un solo. Algo así como:

- El rango "A1:A10" de mi "Hoja1" lo he nombrado "Rango1"...

Abraham Valencia

Claro en este caso son celdas ejemplo la celda a1 se llama "RutTitular", la b1 se llama "NombreTitular" y así sucesivamente y esas las debo pegar en otro excel que tiene los mismos nombres de celdas pero puede que este en la celda b12 por eso debo trabajar con los nombres de rango los cuales no varían según el archivo por eso no puedo llevar un orden y son muchas como para declarar una por una en la macros.

---------------------------------------------

Campo = Range("RutTitular").Offset(1, i).Name

En la variable campo debo obtener el nombre que tiene ese campo en particular (celda A1) que ira variando según va recorriendo la fila (antes guarde el valor del campo en la variable Dato)

Windows(Formulario).Activate

'luego abro otro libro el cual tiene definidas las celdas con los mismo nombres que estan en la hoja anterior.
Range(Campo).Value = Dato

'según sea el nombre del campo pegare el valor que había rescatado en el otro libro.

espero que ahora quede mas claro.

resumen:

tengo un excel con 3 (irán aumentando) hojas que corresponden a formularios distintos.

cada hoja tiene campos variables los que se llenaran desde MySQL (eso lo tengo resuelto) que tienen nombres de rango.

luego abro el excel que corresponde a la hoja activa y necesito pegar el campo según el nombre del campo en su respectivo rango. para luego guardar ese archivo .

en esto ultimo es en lo único que topo.

saludos.

Hummm, insisto, al conocer los nombres de los rangos, así aquellos correspondan a libros y celdas diferentes, no le veo el mayor problema:

Workbooks("Archivo2.xlsx").Sheets("Hoja1000").Range("MiRango").Value = Workbooks("Archivo1.xlsx").Sheets("Hoja456").Range("MiRango").Value

Así "MiRango" en un archivo sea "H6" y en el otro sea "J8", pues copia los valores en dichas celdas.

Abraham Valencia

¡Gracias!

Vale perrito, lo que sucede es que claro los conozco porque los definí pero estos cambian de ubicación en el otro libro, es esa el problema que se genera.

Saludos

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas