Seleccion de rango variable

12/11/2008 - 19:27 por rodmac | Informe spam
Saludos:

Tengo una tabla de datos de 30 culumnas por un valor variable de renglones,
es necesario que copiar las ultimas 24 celdas que cada renglon para
colocarlos en otra tabla y al pegarlos debe ser de forma transpuesta.

He intentado colocar como variable el numero de renglon en un "range" pero
me indica que hay errores en el codigo de VB.

.Range(.Cells(22, n3), .Cells(69, n3)).Select donde n3 es el renglon
variable

No se si sea la forma correcta. Me podrian orientar para este inconveniente

saludos

Rodmac

Preguntas similare

Leer las respuestas

#1 Juan Español
12/11/2008 - 21:49 | Informe spam
Saludos rodmac:

Una solución puede ser hacer fijo tu rango variable.
Para ello vamos a hacer que la fila 1 tenga siempre los datos de la última
fila, sea esta la que sea.

Lo primero es saber que columna es "la importante" y si puede haber celdas
en blanco en esa columna.
Si la columna que siempre tiene datos es la A y

suponiendo que NO hay filas en blanco intermedias y que tus datos empiecen
en A3 y pueden llegar hasta A3000

A1=INDIRECTO(DIRECCION(CONTARA($A$3:$A$3000)+2;COLUMNA();1;1))

arrastras hacia la derecha la celda A1 hasta la que quieras.

Ahora en tu código puedes hacer referencia al rango de la fila A y copiarlo
y trasponerlo como quieras.

Con código también se puede hacer:

Si la columna que siempre tiene datos es la A y que
En A2 tienes el ROTULO de la columna
suponiendo que NO hay filas en blanco intermedias y que tus datos empiecen
en A3 y pueden llegar hasta A3000

Este código te sitúa en la última celda ocupada de la columna A

Range("A2").Select
Do While ActiveCell <> Empty
ActiveCell.Offset(1, 0).Select
Loop
ActiveCell.Offset(-1, 0).Select

Sin datos más precisos (columna, fila donde empiezan tus datos, rango
máximo, etc. etc.) no se llegar más allá.

Saludos,

Juan Español.

"rodmac" escribió en el mensaje
news:
Saludos:

Tengo una tabla de datos de 30 culumnas por un valor variable de renglones,
es necesario que copiar las ultimas 24 celdas que cada renglon para
colocarlos en otra tabla y al pegarlos debe ser de forma transpuesta.

He intentado colocar como variable el numero de renglon en un "range" pero
me indica que hay errores en el codigo de VB.

.Range(.Cells(22, n3), .Cells(69, n3)).Select donde n3 es el renglon
variable

No se si sea la forma correcta. Me podrian orientar para este inconveniente

saludos

Rodmac
Respuesta Responder a este mensaje
#2 rodmac
13/11/2008 - 01:14 | Informe spam
Muchas gracias por tu respuesta Juan.
He estado probando varias formulas y en un a cuastion posterior de ellas
solo esta mal la sintaxis (eso espero) lo que me comentas es bueno para pocos
renglones , yo utilizo mas de 5 mil.

saludos rod

"Juan Español" wrote:

Saludos rodmac:

Una solución puede ser hacer fijo tu rango variable.
Para ello vamos a hacer que la fila 1 tenga siempre los datos de la última
fila, sea esta la que sea.

Lo primero es saber que columna es "la importante" y si puede haber celdas
en blanco en esa columna.
Si la columna que siempre tiene datos es la A y

suponiendo que NO hay filas en blanco intermedias y que tus datos empiecen
en A3 y pueden llegar hasta A3000

A1=INDIRECTO(DIRECCION(CONTARA($A$3:$A$3000)+2;COLUMNA();1;1))

arrastras hacia la derecha la celda A1 hasta la que quieras.

Ahora en tu código puedes hacer referencia al rango de la fila A y copiarlo
y trasponerlo como quieras.

Con código también se puede hacer:

Si la columna que siempre tiene datos es la A y que
En A2 tienes el ROTULO de la columna
suponiendo que NO hay filas en blanco intermedias y que tus datos empiecen
en A3 y pueden llegar hasta A3000

Este código te sitúa en la última celda ocupada de la columna A

Range("A2").Select
Do While ActiveCell <> Empty
ActiveCell.Offset(1, 0).Select
Loop
ActiveCell.Offset(-1, 0).Select

Sin datos más precisos (columna, fila donde empiezan tus datos, rango
máximo, etc. etc.) no se llegar más allá.

Saludos,

Juan Español.

"rodmac" escribió en el mensaje
news:
Saludos:

Tengo una tabla de datos de 30 culumnas por un valor variable de renglones,
es necesario que copiar las ultimas 24 celdas que cada renglon para
colocarlos en otra tabla y al pegarlos debe ser de forma transpuesta.

He intentado colocar como variable el numero de renglon en un "range" pero
me indica que hay errores en el codigo de VB.

..Range(.Cells(22, n3), .Cells(69, n3)).Select donde n3 es el renglon
variable

No se si sea la forma correcta. Me podrian orientar para este inconveniente

saludos

Rodmac



Respuesta Responder a este mensaje
#3 Ivan
13/11/2008 - 03:06 | Informe spam
hola,

[creo que] una posibilidad seria algo asi =>

Sub transponer(ByVal rng As Range, _
ByRef rngDestino As Range)
Application.ScreenUpdating = False
rng.Copy
rngDestino.PasteSpecial Transpose:=True
Application.CutCopyMode = False
Application.ScreenUpdating = True
End Sub

por un lado como habras visto no es necesario seleccionar ningun rango
para hacer lo que pides,

pero por otro lado, creo que los daos que das pecan de un poco
escuetos.

Solo por ampliar un poco el tema y ya de paso mostrarte un poco hasta
que punto existen posibilidades con los datos que expones (de hecho
existen otras muchas mas posibilidades), permiteme algunas dudas sobre
la marcha en tu consulta y ya de paso una posibilidad de ej. imaginada
por mi para esa respuesta

Tengo una tabla de datos de 30 culumnas



¿Que columnas?...

para la 'posibilidad' que te voy a poner al final voy a suponer que
son de la A a la AD, ambas incluidas

por un valor variable de renglones,



¿Cual es el 1er renglon?...

voy a suponer que es la FILA Nº1

¿tiene fila de titulos?

voy a suponer que SI

¿puede variar [de posicion] esta 1ª fila? ...

voy a suponer que NO

Pueden existir filas/renglones totalmente vacios entre medias?

voy a suponer que NO

=> bueno, con lo que llevamos supuesto hasta ahora ya podriamos
obtener un dato 'interesante' => el Nº de la ULTIMA fila con datos de
tu lista inicial


dim ultFila as long

' Cargamos en la variable ultFila dicho nº

ultFila = Worksheets("NombreDeTuHoja_Inicial") _
.Range("a1").CurrentRegion.Rows.Count

OJO al guion bajo precedido de un espacio de la 2ª linea: es el
caracter de continuacion de linea

es necesario que copiar las ultimas 24 celdas que cada renglon



NOTA: de acuerdo a mis suposiciones anteriores estariamos hablando de
las columnas de la G a la AD [.. si no he contado mal :-)]

¿las 24 ultimas celdas de

-> la ultima fila? =>

Worksheets("NombreDeTuHoja_Inicial") _
.Range("g" & ultFila & ":ad" & ultFila).Copy

-> una fila concreta intermedia? =>

cambia en lo anterior ultFila por dicha fila [¿n3?]

-> todas las filas menos la de titulos? =>

Worksheets("NombreDeTuHoja_Inicial") _
.Range("g2:ad" & ultFila).Copy

para colocarlos en otra tabla



¿a partir de donde?

voy a suponer que esta segunda lista tambien empieza en la columna A,
que tambien tiene fila de titulos en la 1ª fila, que tampoco tiene
filas completamente vacias entre medias y que quieres pegar los datos
a partir de la primera fila libre (incluida)

para hallar la 1ª fila libre hariamos lo mismo que en la otra hoja
pero le sumariamos 1 al resultado

dim ultFila2 as long

' Cargamos en la variable ultFila2 dicho nº

ultFila2 = Worksheets("NombreDeTuHoja_Final") _
.Range("a1").CurrentRegion.Rows.Count + 1

y al pegarlos debe ser de forma transpuesta.



una vez copiado esta seria una posibilidad:

1ªCeldaRangoDestino.PasteSpecial Transpose:=True

y juntando todos los supuestos, pero usando en el ej. el que pega
todas las filas de golpe =>

' en un modulo NORMAL pegamos los siguientes codigos

' el procedimiento mencionado arriba, al que le pasaremos como
parametros el rango completo a copiar (sea una fila, o sean 5000 <OJO
al comentario que te pongo al final>) y la primera celda de destino (a
partir de la que se va a pegar)

Sub transponer(ByVal rng As Range, rngDestino As Range)
Application.ScreenUpdating = False
rng.Copy
rngDestino.PasteSpecial Transpose:=True
Application.CutCopyMode = False
Application.ScreenUpdating = True
End Sub

Sub testTransponer()

' declaramos una variable para la/s
' ultima/s fila/s y otra para el rango
' que vamos a copiar (esto no es
' imprescindible, podria hacerse directo
' pero asi ves otra forma)
Dim ultFila As Long, rngIni As Range

' con la hoja de tu lista de origen
With Worksheets("NombreDeTuHoja_Inicial")

' hallamos la ultima fila con datos
ultFila = .Range("a1").CurrentRegion.Rows.Count

' si no hay datos en la lista salimos
If ultFila < 2 Then Exit Sub

' si si los hay cargamos la variable
' rngIni con todas las filas de datos
' de las ultimas 24 columnas
Set rngIni = .Range("g2:ad" & ultFila)

End With

' con la hoja de destino
With Worksheets("NombreDeTuHoja_Final")

' hallamos la primera fila sin datos
ultFila = .Range("a1").CurrentRegion.Rows.Count + 1

' mediante el procedimiento transponer
' pegamos transpuestos a partir de ella
' los datos del rango inicial
transponer rngIni, .Range("a" & ultFila)

End With

' descargamos de memoria la variable rngIni
Set rngIni = Nothing

End Sub

ahora puedes ejecutar la macro testTransponer (obviamente adaptandolo
a tu caso real)

como NOTA solo un comentario: supongo que se trata de la version 2007,
pues de lo contrario solo podrias transponer un maximo de 256
registros

bueno espero te ayude [y disculpa el rollo :-D]

un saludo
Ivan
Respuesta Responder a este mensaje
#4 rodmac
13/11/2008 - 19:33 | Informe spam
Ivan.

Muchisimas gracias por tu atencion. Me vas a poner a estudiar detenidamente
este codigo, no conocia la moyoria de las sentencias, solo he utilizado lo de
un manual basico que circula por la red (macros.pdf de 500K) Lo puedo
utilizar casi al 100% . Muchas de tus deducciones son correctas. si tengo
algun comentario posteriormente lo comentare en el foro.

"Ivan" wrote:

hola,

[creo que] una posibilidad seria algo asi =>

Sub transponer(ByVal rng As Range, _
ByRef rngDestino As Range)
Application.ScreenUpdating = False
rng.Copy
rngDestino.PasteSpecial Transpose:=True
Application.CutCopyMode = False
Application.ScreenUpdating = True
End Sub

por un lado como habras visto no es necesario seleccionar ningun rango
para hacer lo que pides,

pero por otro lado, creo que los daos que das pecan de un poco
escuetos.

Solo por ampliar un poco el tema y ya de paso mostrarte un poco hasta
que punto existen posibilidades con los datos que expones (de hecho
existen otras muchas mas posibilidades), permiteme algunas dudas sobre
la marcha en tu consulta y ya de paso una posibilidad de ej. imaginada
por mi para esa respuesta

> Tengo una tabla de datos de 30 culumnas

¿Que columnas?...

para la 'posibilidad' que te voy a poner al final voy a suponer que
son de la A a la AD, ambas incluidas

>por un valor variable de renglones,

¿Cual es el 1er renglon?...

voy a suponer que es la FILA Nº1

¿tiene fila de titulos?

voy a suponer que SI

¿puede variar [de posicion] esta 1ª fila? ...

voy a suponer que NO

Pueden existir filas/renglones totalmente vacios entre medias?

voy a suponer que NO

=> bueno, con lo que llevamos supuesto hasta ahora ya podriamos
obtener un dato 'interesante' => el Nº de la ULTIMA fila con datos de
tu lista inicial


dim ultFila as long

' Cargamos en la variable ultFila dicho nº

ultFila = Worksheets("NombreDeTuHoja_Inicial") _
.Range("a1").CurrentRegion.Rows.Count

OJO al guion bajo precedido de un espacio de la 2ª linea: es el
caracter de continuacion de linea

> es necesario que copiar las ultimas 24 celdas que cada renglon

NOTA: de acuerdo a mis suposiciones anteriores estariamos hablando de
las columnas de la G a la AD [.. si no he contado mal :-)]

¿las 24 ultimas celdas de

-> la ultima fila? =>

Worksheets("NombreDeTuHoja_Inicial") _
.Range("g" & ultFila & ":ad" & ultFila).Copy

-> una fila concreta intermedia? =>

cambia en lo anterior ultFila por dicha fila [¿n3?]

-> todas las filas menos la de titulos? =>

Worksheets("NombreDeTuHoja_Inicial") _
.Range("g2:ad" & ultFila).Copy

> para colocarlos en otra tabla

¿a partir de donde?

voy a suponer que esta segunda lista tambien empieza en la columna A,
que tambien tiene fila de titulos en la 1ª fila, que tampoco tiene
filas completamente vacias entre medias y que quieres pegar los datos
a partir de la primera fila libre (incluida)

para hallar la 1ª fila libre hariamos lo mismo que en la otra hoja
pero le sumariamos 1 al resultado

dim ultFila2 as long

' Cargamos en la variable ultFila2 dicho nº

ultFila2 = Worksheets("NombreDeTuHoja_Final") _
.Range("a1").CurrentRegion.Rows.Count + 1

>y al pegarlos debe ser de forma transpuesta.

una vez copiado esta seria una posibilidad:

1ªCeldaRangoDestino.PasteSpecial Transpose:=True

y juntando todos los supuestos, pero usando en el ej. el que pega
todas las filas de golpe =>

' en un modulo NORMAL pegamos los siguientes codigos

' el procedimiento mencionado arriba, al que le pasaremos como
parametros el rango completo a copiar (sea una fila, o sean 5000 <OJO
al comentario que te pongo al final>) y la primera celda de destino (a
partir de la que se va a pegar)

Sub transponer(ByVal rng As Range, rngDestino As Range)
Application.ScreenUpdating = False
rng.Copy
rngDestino.PasteSpecial Transpose:=True
Application.CutCopyMode = False
Application.ScreenUpdating = True
End Sub

Sub testTransponer()

' declaramos una variable para la/s
' ultima/s fila/s y otra para el rango
' que vamos a copiar (esto no es
' imprescindible, podria hacerse directo
' pero asi ves otra forma)
Dim ultFila As Long, rngIni As Range

' con la hoja de tu lista de origen
With Worksheets("NombreDeTuHoja_Inicial")

' hallamos la ultima fila con datos
ultFila = .Range("a1").CurrentRegion.Rows.Count

' si no hay datos en la lista salimos
If ultFila < 2 Then Exit Sub

' si si los hay cargamos la variable
' rngIni con todas las filas de datos
' de las ultimas 24 columnas
Set rngIni = .Range("g2:ad" & ultFila)

End With

' con la hoja de destino
With Worksheets("NombreDeTuHoja_Final")

' hallamos la primera fila sin datos
ultFila = .Range("a1").CurrentRegion.Rows.Count + 1

' mediante el procedimiento transponer
' pegamos transpuestos a partir de ella
' los datos del rango inicial
transponer rngIni, .Range("a" & ultFila)

End With

' descargamos de memoria la variable rngIni
Set rngIni = Nothing

End Sub

ahora puedes ejecutar la macro testTransponer (obviamente adaptandolo
a tu caso real)

como NOTA solo un comentario: supongo que se trata de la version 2007,
pues de lo contrario solo podrias transponer un maximo de 256
registros

bueno espero te ayude [y disculpa el rollo :-D]

un saludo
Ivan

Respuesta Responder a este mensaje
#5 Ivan
14/11/2008 - 01:31 | Informe spam
hola,

me alergro que al menos te haya dado una idea, pero permiteme una
correccion y algunos comentarios

.-=> la correccion:

acabo de caer en la cuenta de que en caso de que realmente quieras ir
añadiendo los registros al final de una lista ya existente y dado que
estas transponiendo los datos, y dependiendo de como sea la estructura
de las tablas inicial y final, =>

quizas donde deseas añadir los registros en la lista de destino no es
en la 1ª fila libre, sino en la 1ª columna vacia

si fuese asi deberias cambiar donde asignamos la variable rngIni en la
hoja de destino el uso de Rows por el de Columns, aparte de alguna
ligera modificacion que podria ser algo asi =>

' [solo] para hacerlo mas claro declaramos una
' variable 'propia' para este numero de columna
Dim colIni as long

' hallamos la primera columna sin datos
colIni = .Range("a1").CurrentRegion.Columns.Count + 1

ahora, para hallar la 1ª celda del rango de destino la cosa si
variaria un poco.

Pej. esta podria ser una forma de uso del procedimiento 'transponer'
para este nuevo caso =>

transponer rngIni, .cells(2, colIni)

(OJO: pongo la fila 1 como primera fila para el pegado, pues supongo
que en este nuevo 'supuesto' (valga las/s redundancia/s) no habria
titulos en la fila 1, sino seguramente en la columna A, o al menos a
mi me parece que tiene mas sentido asi. Pero como te decia todo
depende de la estructura de tu tabla)=>

OJO_2 [solo por si lo desconocieras y porque es un detalle que en el
foro web apenas se ve y puede provocar errores]:=>

fijate en que cuando usamos Range o Cells (en este caso, pero es
aplicable a otros muchos), en el procedimiento testTransponer van
precedidos de un punto, el cual indica que hacen referencia
(pertenecen +/-) al objeto que abre los bloques 'With End
With' [1º la hoja inical y luego la final]

es lo mismo que si hubieramos prescindido del uso de 'With ...' y lo
hubiesemos puesto seguido =>

WorkSheets("Tal").Range("Cual")

bueno, lo dicho, solo porque los dichosos puntos a veces apenas se ven
(al menos en mi navegador) y si no lo controlas o no te das cuenta te
podria marear

. Me vas a poner a estudiar detenidamente
este codigo, no conocia la moyoria de las sentencias,



una cosa que [en mi opinion] te puede echar una buena mano es la
propia ayuda de VBA =>

cuando estes en el editor, situa el cursor sobre los terminos que no
conozcas y dale a F1.

En general te mostrara la ayuda sobre dicho elemento, y aunque al
principio puede costar un poco entenderla, se le coge rapido el
'tranquillo' y te aseguro que (al menos en mi caso) acaba haciendose
totalmente imprescindible

solo he utilizado lo de
un manual basico que circula por la red (macros.pdf de 500K)



en multiples mensajes del foro se han dado gran numero de direcciones
con manuales y/o informacion sobre VBA que quizas te sirvan para ir
ampliando conocimientos al respecto. De hecho, si pones en el buscador
del foro (via web/google) el termino Manual VBA, seguro que te
aparecen numerosas opciones [sorry, ahora mismo no tengo a mano
ninguna].

seguramente tampoco esta de mas echarle un ojo a algun manual de VB
[OJO: no VB Net], pues son bastante mas numerosos y lo que se refiere
a las estructuras y fundamentos del lenguaje son practicamente
identicos (a mi al menos me vino muy bien)

. si tengo
algun comentario posteriormente lo comentare en el foro.



y por supuesto, si te gusta el tema, y de nuevo en mi opinion, el
mejor e imprecindible manual para aprender por tu cuenta, es este foro
con sus fantasticos usuarios

[ .. bueno, y meter la pata tropecientasmil veces sin desesperarte
demasiado ... :-D ]

un saludo y gracias tambien a ti por el feedback

Ivan
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida