Especificar un rango nombrado en una macro

29/05/2007 - 18:20 por Francisco | Informe spam
Hola a todos:
Estoy trabajando en una macro que utiliza el filtro avanzado para extraer
registros únicos. Pero resulta que el rango base (al cual le defino un
nombre) de donde voy a extraer los datos puede variar en tamaño en el numero
de filas en cada ocasión en que voy a correr la macro.
No he podido lograr el que la redefinición del rango cambie en la macro.
Esta se queda siempre con la primera definición.
Si redefino el rango con el mismo nombre fuera de la macro (antes de
correrla) no lo toma en cuenta.
Si incluyo en la misma macro esta misma operacion, definiendo el tamaño del
rango con movimiento de teclas (mays-fin-derecha; mays-fin-abajo) igual se
queda fija la definición con que grabe la macro.
Me podria alguien orientar para resolver este problema?
Apreciare su sapiencia.

Saludos
Francisco

Preguntas similare

Leer las respuestas

#6 Francisco
29/05/2007 - 23:27 | Informe spam
Hola Hector :

Funcionó perfecto!! Con esta forma se supone que no debo de tener nada
debajo del rango de extraccion..Si lo que se mueve (se reduce o incrementa )
es el numero de filas - utilizo las columnas b:h - es necesario seleccionar
hasta la última fila de la hoja y luego "encoger"? ... es solo pregunta
curiosa...

Tengo otro caso similar pero no utiliza filtros.
En una macro (para hacer la facturacion mensual de conceptos de obra de
construccion) en la que utilizo la funcion BUSCARV dentro de un bucle que
ejecuta la formula en diferentes columnas y en el numero de renglones igual
al numero de iteraciones del bucle, donde el rango de busqueda (que es el
presupuesto con num. de partida, descripcion, precio unitario, precio total)
- que originalmente era fijo y tiene un nombre, ahora ha cambiado - se han
incrementado el numero de partidas del presupuesto- , la macro no me
reconoce la nueva definicion de rango del nombre. Asi que para las nuevas
partidas hago el proceso manualmente. (espero haber sido preciso en el
planteamiento)
Me podrias ayudar con este problema?

Gracias y saludos
Francisco
Tampico, México


"Héctor Miguel" escribió:

hola, Francisco !

> Estoy trabajando en una macro que utiliza el filtro avanzado para extraer registros unicos.
> Pero resulta que el rango base (al cual le defino un nombre) de donde voy a extraer los datos
> puede variar en tama#o en el numero de filas en cada ocasion en que voy a correr la macro.
> No he podido lograr el que la redefinicion del rango cambie en la macro.
> Esta se queda siempre con la primera definicion...

>> ... el problema consiste en que el rango... hoy puede ser b8:h40 y el proximo mes b8:h47...

no es necesario re/definir nombres para actuar en rangos de/crecientes mediante macros [p.e.]

si suponemos que la columna que 'manda' cual seria la ultima fila es la columna 'B' -?-

a) si estas trabajando sobre la hoja activa, y quieres filtros avanzados en las columnas 'B:H' iniciando en la fila 8
Range(Range("b8"), Range("b65536").End(xlUp)).Resize(, 7).AdvancedFilter .. etc. etc. etc. ...

b) si la hoja sobre la que vas a filtrar NO es la hoja activa...
With Worksheets("hoja1")
.Range(.Range("b8"), .Range("b65536").End(xlUp)).Resize(, 7).AdvancedFilter .. etc. etc. etc. ...
End With

si cualquier duda [o informacion adicioal]... comentas ?
saludos,
hector.



Respuesta Responder a este mensaje
#7 Francisco
30/05/2007 - 00:03 | Informe spam
Hola David:

Tu propuesta me parece bastante mas universal . Funcionaria para el caso que
expuse originalmente y creo que serviría además para el otro caso que le
expuse a Héctor Miguel en la respuesta a su propuesta.
No la he probado aún porque me llevaría un poco mas de tiempo, pero como la
interpreto es que redefine el rango nombrado si es que este creció en número
de filas y es esto lo que buscaba.
Agradezco a ambos su cooperación...

Saludos

Francisco
Tampico, México


"David" escribió:

Tal y como dice Héctor, no es necesario que trabajes con nombres de rangos.
Podrías detectar el rango de tus datos por alguno de los métodos que él
provee, y aplicar el filtro.

Ahora, como desconozco tu aplicación, si es totalmente necesario, puedes
utilizar el objeto Name:

activeworkbook.Names("David").RefersTo = "=Hoja1!R1C1:R5C10"

Esta línea te redefiniría el nombre de rango "David" hacia las celdas A1:J5.

Para utilizar variables, supongamos que tu base de datos ocupa las columnas
A:M. ¿Tienes alguna columna que no tenga celdas vacías? Si ese fuera el
caso, supongamos que fuera la columna B. Podrías detectar la última fila
usada con lo siguiente:

Al principio de tu código:
Dim UF as long

Y luego:
UF = ActiveSheet.Range("B65536").End(xlUp).Row

para redefinir tu nombre de rango con:
activeworkbook.Names("David").RefersTo = "=Hoja1!R1C1:R12C" & UF

Pero también lo podrías hacer sin utilizar variables:
activeworkbook.Names("David").RefersTo = "=Hoja1!R1C1:R12C" &
ActiveSheet.Range("B65536").End(xlUp).Row

(lo anterior es una sola línea)

Comentas si esto te ayuda a resolver el problema.




"Francisco" escribió:

> Gracias David, pero el problema no es eso... el problema consiste en que el
> rango "david" hoy puede ser b8:h40 y el proximo mes b8:h47. Necesito que
> dentro de la macro puede redefinir "david" como b8:h47, siendo que
> originalmente cuando grabe la macro era b8:h40. No lo cambia; supongo que
> habra que definir variables pero no se comolo sabes tu?
>
> "David" escribió:
>
> > Hola, Francisco.
> >
> > Con la grabadora de macros, probablemente no te detecte la selección de un
> > rango por su nombre, sino solamente por sus coordenadas o direcciones.
> > Prueba introducir manualmente esta línea en tu código:
> >
> > Application.Goto Reference:="David"
> >
> > donde David (¡claro!) es el nombre de tu rango.
> >
> > - Esto último a tono de broma... ;) -
> >
> >
> >
> > "Francisco" escribió:
> >
> > > Hola a todos:
> > > Estoy trabajando en una macro que utiliza el filtro avanzado para extraer
> > > registros únicos. Pero resulta que el rango base (al cual le defino un
> > > nombre) de donde voy a extraer los datos puede variar en tamaño en el numero
> > > de filas en cada ocasión en que voy a correr la macro.
> > > No he podido lograr el que la redefinición del rango cambie en la macro.
> > > Esta se queda siempre con la primera definición.
> > > Si redefino el rango con el mismo nombre fuera de la macro (antes de
> > > correrla) no lo toma en cuenta.
> > > Si incluyo en la misma macro esta misma operacion, definiendo el tamaño del
> > > rango con movimiento de teclas (mays-fin-derecha; mays-fin-abajo) igual se
> > > queda fija la definición con que grabe la macro.
> > > Me podria alguien orientar para resolver este problema?
> > > Apreciare su sapiencia.
> > >
> > > Saludos
> > > Francisco
Respuesta Responder a este mensaje
#8 Héctor Miguel
30/05/2007 - 00:11 | Informe spam
hola, Francisco !

... es necesario seleccionar hasta la ultima fila de la hoja y luego "encoger"? ... es solo pregunta curiosa...



=> no.. es solamente una referencia a una celda *de partida* donde se supone/conoce/espera/... que no existen datos
para poder 'subir' hasta encontrar la prmera fila 'ocupada' [que pasaria a ser la 'ultima' hasta la celda de partida] ;)

Tengo... una macro... en la que utilizo la funcion BUSCARV dentro de un bucle que ejecuta la formula
en diferentes columnas y en el numero de renglones igual al numero de iteraciones del bucle, donde el rango de busqueda...
... que originalmente era fijo y tiene un nombre, ahora ha cambiado - se han incrementado el numero de partidas del presupuesto-
la macro no me reconoce la nueva definicion de rango del nombre. Asi que para las nuevas partidas hago el proceso manualmente.
(espero haber sido preciso en el planteamiento) Me podrias ayudar con este problema?



=> si expones la macro... [y alguno que otro detalle, de esos que no se alcanzaron a *ver* desde este lado del mensaje] :))
de seguro, habra mas de uno que pueda ofrecer alternativas de -posibe- solucion
[p.e. iniciando una nueva consulta ?] ;)

saludos,
hector.
Respuesta Responder a este mensaje
#9 Francisco
31/05/2007 - 19:19 | Informe spam
Hola otra vez David:
El dia de hoy he tratado de probar la formula que propusiste, pero algo hice
mal porque no esta funcionando. El macro me indica error en la formula.
La informacion de la hoja de trabajo en donde opero esto es la sig:

El macro me sirve para llenar un formato en renglones consecutivos haciendo
uso de la funcion "Buscarv" en tres columnas del formato (Descripcion,
Unidad, Precio Unitario). La hoja se llama "Resumen Mens"

La hoja donde esta el rango de busqueda se llama "Presup". El rango de
busqueda esta nombrado como "tabla" e inicia en A20 y actualmente termina en
K760 (pero como aclare anteriormente puede crecer en numero de filas)

En las primeras cinco columnas no hay celdas vacias

La formula que propusiste, asumiendo el rango A:M, fue:
activeworkbook.Names("David").RefersTo = "=Hoja1!R1C1:R12C" &
ActiveSheet.Range("B65536").End(xlUp).Row

traducido a mi libro de trabajo lo puse
Activeworkbook.Names("Tabla").RefersTo = "=Presup!R20C1:R20C" &
ActiveSheet.Range("A65536").End(xlUp).Row

Lo que no me quedo claro como expande a la columna K y como resolver lo que
aclaro Hector acerca de que ActiveSheet. no necesariamente es, en mi caso
Presup!
Me puedes ayudar con esto ya con los datos que te doy arriba?

Francisco




"Francisco" escribió:


Hola David:

Tu propuesta me parece bastante mas universal . Funcionaria para el caso que
expuse originalmente y creo que serviría además para el otro caso que le
expuse a Héctor Miguel en la respuesta a su propuesta.
No la he probado aún porque me llevaría un poco mas de tiempo, pero como la
interpreto es que redefine el rango nombrado si es que este creció en número
de filas y es esto lo que buscaba.
Agradezco a ambos su cooperación...

Saludos

Francisco
Tampico, México


"David" escribió:

> Tal y como dice Héctor, no es necesario que trabajes con nombres de rangos.
> Podrías detectar el rango de tus datos por alguno de los métodos que él
> provee, y aplicar el filtro.
>
> Ahora, como desconozco tu aplicación, si es totalmente necesario, puedes
> utilizar el objeto Name:
>
> activeworkbook.Names("David").RefersTo = "=Hoja1!R1C1:R5C10"
>
> Esta línea te redefiniría el nombre de rango "David" hacia las celdas A1:J5.
>
> Para utilizar variables, supongamos que tu base de datos ocupa las columnas
> A:M. ¿Tienes alguna columna que no tenga celdas vacías? Si ese fuera el
> caso, supongamos que fuera la columna B. Podrías detectar la última fila
> usada con lo siguiente:
>
> Al principio de tu código:
> Dim UF as long
>
> Y luego:
> UF = ActiveSheet.Range("B65536").End(xlUp).Row
>
> para redefinir tu nombre de rango con:
> activeworkbook.Names("David").RefersTo = "=Hoja1!R1C1:R12C" & UF
>
> Pero también lo podrías hacer sin utilizar variables:
> activeworkbook.Names("David").RefersTo = "=Hoja1!R1C1:R12C" &
> ActiveSheet.Range("B65536").End(xlUp).Row
>
> (lo anterior es una sola línea)
>
> Comentas si esto te ayuda a resolver el problema.
>
>
>
>
> "Francisco" escribió:
>
> > Gracias David, pero el problema no es eso... el problema consiste en que el
> > rango "david" hoy puede ser b8:h40 y el proximo mes b8:h47. Necesito que
> > dentro de la macro puede redefinir "david" como b8:h47, siendo que
> > originalmente cuando grabe la macro era b8:h40. No lo cambia; supongo que
> > habra que definir variables pero no se comolo sabes tu?
> >
> > "David" escribió:
> >
> > > Hola, Francisco.
> > >
> > > Con la grabadora de macros, probablemente no te detecte la selección de un
> > > rango por su nombre, sino solamente por sus coordenadas o direcciones.
> > > Prueba introducir manualmente esta línea en tu código:
> > >
> > > Application.Goto Reference:="David"
> > >
> > > donde David (¡claro!) es el nombre de tu rango.
> > >
> > > - Esto último a tono de broma... ;) -
> > >
> > >
> > >
> > > "Francisco" escribió:
> > >
> > > > Hola a todos:
> > > > Estoy trabajando en una macro que utiliza el filtro avanzado para extraer
> > > > registros únicos. Pero resulta que el rango base (al cual le defino un
> > > > nombre) de donde voy a extraer los datos puede variar en tamaño en el numero
> > > > de filas en cada ocasión en que voy a correr la macro.
> > > > No he podido lograr el que la redefinición del rango cambie en la macro.
> > > > Esta se queda siempre con la primera definición.
> > > > Si redefino el rango con el mismo nombre fuera de la macro (antes de
> > > > correrla) no lo toma en cuenta.
> > > > Si incluyo en la misma macro esta misma operacion, definiendo el tamaño del
> > > > rango con movimiento de teclas (mays-fin-derecha; mays-fin-abajo) igual se
> > > > queda fija la definición con que grabe la macro.
> > > > Me podria alguien orientar para resolver este problema?
> > > > Apreciare su sapiencia.
> > > >
> > > > Saludos
> > > > Francisco
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida