Seleccionar y copiar filas

21/02/2007 - 13:50 por anabcn | Informe spam
Hola a todos, soy nueva en excel. Es la primera vez que voy a
programar y necesito ayuda.
Tengo una hoja con 45000 registros y necesito copiar en otra hoja las
filas que contengan una determinada información en la columna j y las
previas.
El caso seria, si la columna j a partir de j2 esta llena, copia toda
la fila y muevete arriba y copiala tambien. Ademas mira si ésta fila
previa tiene j en cuyo caso te mueves a la previa y si no continua la
búsqueda.

Se que aparentemente es sencillo, pero sólo he programado en acces y
tampoco tengo mucha experiencia. Además no tengo ni idea de la
nomenclatura que utiliza excel.

Si alguien me puede ayudar se lo agradeceré.

Muchas gracias

Ana

Preguntas similare

Leer las respuestas

#1 David
21/02/2007 - 16:32 | Informe spam
Hola, anabcn.

Lo que has programado en Access te hará fácil entender el siguiente código:

Sub Copiar()
Dim H2 As String, j, i As Integer, seguir As Boolean
seguir = True
H2 = "Hoja2"
j = ActiveCell.Row
i = 1
If Len(Cells(j, 10).Value) > 0 Then
Range(Cells(j, 1), Cells(j, 10)).Copy
Sheets(H2).Cells(i, 1).PasteSpecial
i = i + 1
j = j - 1
Do While seguir
Range(Cells(j, 1), Cells(j, 10)).Copy
Sheets(H2).Cells(i, 1).PasteSpecial
j = j - 1
i = i + 1
If (Len(Cells(j, 10).Value) = 0 And Len(Cells(j + 1, 10).Value)
= 0) Or j < 1 Then seguir = False
Loop
End If
End Sub

Observa cómo se manejan en este código los objetos Sheets, Range, Cells. Es
muy parecido a VBA en Access. Lo malo de este código es que invierte la
posición de las filas, pero podrías intentar cambiando "i=1" por "i=j", y
luego todas las apariciones de "i=i+1" por "i=i-1".

En cuanto a lo que venga por delante, te recomiendo documentarte en los
siguientes sitios (no serán todos, pero a mí me han servido de mucho):

Foro MVP de Access y VBA
http://www.mvp-access.com
Creado por “Búho”, reúne a varios de los más prestigiosos MVP (Most Valuable
Professional), proveyendo vínculos a sus páginas personales y a “Nuestro
Foro”, un grupo de discusión de muy alta calidad, con secciones dedicadas a
Access, Excel y otros. Se necesita registrarse para poder participar.

Fermu’s Website
http://www.fermu.com/
Sitio lleno de recursos relativos a Excel, Windows y similares: artículos,
tips y otros…

Mi Página
http://www.geocities.com/sdgm04/03-VBA.html
En construcción permanente (quisiera, pero el tiempo me limita mucho).
Ejemplos para descargar sobre aplicaciones varias de VBA orientadas a Excel.

AJP Excel Information
http://www.andypope.info
Docenas de tips y ejemplos de aplicaciones de Excel para descargar (con y
sin código).

Sitios con Ejemplos:
http://www.engineering.usu.edu/cee/...amples.htm

http://www.mindspring.com/~tflynn/excelvba.html

http://www.excelworker.virtuabyte.c...amp;Itemid'

Cursos:

http://www.cidse.itcr.ac.cr/cursos-...index.html

http://www.lawebdelprogramador.com/...rar.php?id7&texto=Excel

http://www.angelfire.com/biz7/julia...macros.htm

Foros y material de apoyo:

http://www.sistemaslym.net/vba/exce...tml#Macros

http://www.oaltd.co.uk/

http://j-walk.com/ss/excel/tips/tip23.htm

http://www.sistemaslym.net/vba/excel/

http://www.excelguru.ca/node/18


Bueno, por ahora creo que es suficiente para que te entretengas un poco.

Saludos.



"anabcn" escribió:

Hola a todos, soy nueva en excel. Es la primera vez que voy a
programar y necesito ayuda.
Tengo una hoja con 45000 registros y necesito copiar en otra hoja las
filas que contengan una determinada información en la columna j y las
previas.
El caso seria, si la columna j a partir de j2 esta llena, copia toda
la fila y muevete arriba y copiala tambien. Ademas mira si ésta fila
previa tiene j en cuyo caso te mueves a la previa y si no continua la
búsqueda.

Se que aparentemente es sencillo, pero sólo he programado en acces y
tampoco tengo mucha experiencia. Además no tengo ni idea de la
nomenclatura que utiliza excel.

Si alguien me puede ayudar se lo agradeceré.

Muchas gracias

Ana


Respuesta Responder a este mensaje
#2 anabcn
21/02/2007 - 18:43 | Informe spam
Muchas gracias david, estoy intentando que me funcione, porque quiero
copiar toda la fila, no solo hasta el valor j.
Sigo el código hasta donde hablas de len que imagino que se debe
referir a posición, pero no acabo de entenderlo.

Ya te contaré

Muchas gracias, al menos ya tengo por donde comenzar

Ana
David ha escrito:
Hola, anabcn.

Lo que has programado en Access te hará fácil entender el siguiente código:

Sub Copiar()
Dim H2 As String, j, i As Integer, seguir As Boolean
seguir = True
H2 = "Hoja2"
j = ActiveCell.Row
i = 1
If Len(Cells(j, 10).Value) > 0 Then
Range(Cells(j, 1), Cells(j, 10)).Copy
Sheets(H2).Cells(i, 1).PasteSpecial
i = i + 1
j = j - 1
Do While seguir
Range(Cells(j, 1), Cells(j, 10)).Copy
Sheets(H2).Cells(i, 1).PasteSpecial
j = j - 1
i = i + 1
If (Len(Cells(j, 10).Value) = 0 And Len(Cells(j + 1, 10).Value)
= 0) Or j < 1 Then seguir = False
Loop
End If
End Sub

Observa cómo se manejan en este código los objetos Sheets, Range, Cells. Es
muy parecido a VBA en Access. Lo malo de este código es que invierte la
posición de las filas, pero podrías intentar cambiando "i=1" por "i=j", y
luego todas las apariciones de "i=i+1" por "i=i-1".

En cuanto a lo que venga por delante, te recomiendo documentarte en los
siguientes sitios (no serán todos, pero a mí me han servido de mucho):

Foro MVP de Access y VBA
http://www.mvp-access.com
Creado por "Búho", reúne a varios de los más prestigiosos MVP (Most Valuable
Professional), proveyendo vínculos a sus páginas personales y a "Nuestro
Foro", un grupo de discusión de muy alta calidad, con secciones dedicadas a
Access, Excel y otros. Se necesita registrarse para poder participar.

Fermu's Website
http://www.fermu.com/
Sitio lleno de recursos relativos a Excel, Windows y similares: artículos,
tips y otros...

Mi Página
http://www.geocities.com/sdgm04/03-VBA.html
En construcción permanente (quisiera, pero el tiempo me limita mucho).
Ejemplos para descargar sobre aplicaciones varias de VBA orientadas a Excel.

AJP Excel Information
http://www.andypope.info
Docenas de tips y ejemplos de aplicaciones de Excel para descargar (con y
sin código).

Sitios con Ejemplos:
http://www.engineering.usu.edu/cee/...amples.htm

http://www.mindspring.com/~tflynn/excelvba.html

http://www.excelworker.virtuabyte.c...amp;Itemid'

Cursos:

http://www.cidse.itcr.ac.cr/cursos-...index.html

http://www.lawebdelprogramador.com/...rar.php?id7&texto=Excel

http://www.angelfire.com/biz7/julia...macros.htm

Foros y material de apoyo:

http://www.sistemaslym.net/vba/exce...tml#Macros

http://www.oaltd.co.uk/

http://j-walk.com/ss/excel/tips/tip23.htm

http://www.sistemaslym.net/vba/excel/

http://www.excelguru.ca/node/18


Bueno, por ahora creo que es suficiente para que te entretengas un poco.

Saludos.



"anabcn" escribió:

> Hola a todos, soy nueva en excel. Es la primera vez que voy a
> programar y necesito ayuda.
> Tengo una hoja con 45000 registros y necesito copiar en otra hoja las
> filas que contengan una determinada información en la columna j y las
> previas.
> El caso seria, si la columna j a partir de j2 esta llena, copia toda
> la fila y muevete arriba y copiala tambien. Ademas mira si ésta fila
> previa tiene j en cuyo caso te mueves a la previa y si no continua la
> búsqueda.
>
> Se que aparentemente es sencillo, pero sólo he programado en acces y
> tampoco tengo mucha experiencia. Además no tengo ni idea de la
> nomenclatura que utiliza excel.
>
> Si alguien me puede ayudar se lo agradeceré.
>
> Muchas gracias
>
> Ana
>
>
Respuesta Responder a este mensaje
#3 Ivan
21/02/2007 - 19:42 | Informe spam
hola Ana, y David y resto de aforados

no estoy seguro de comprender la consulta, pero si lo que quieres es copiar
todas las filas de una hoja que contengan 'algo' en la columna 'J' en otra
hoja, tambien podrias hacer algo parecido a esto

Sub CopiarFilasSiJ()
Dim celda as Range, fin as Long
With Worksheets("Nombre de la hoja de origen")
' buscamos la ultima fila con datos en J
fin = .[J65536].End(Xlup).Row
' recorremos la columna J y copiamos las filas si J no esta vacia y
las pegamos
' en la primera fila libre de la hoja de destino. OJO-> mira las
notas despues del codigo
For Each celda In .Range("J2:J" & fin)
If celda <> "" Then celda.EntireRow.Copy _
Worksheets("aqui nombre hoja
destino").[a65536].End(xlup).Offset(1)
Next
End With
End Sub

NOTAS: 1) importante que en las dos hojas haya una fila de titulos o al
menos un dato en la columna J .
2) esta forma de copiar pega (creo) absolutamente
todo(valores, formatos, formulas,...), si no quieres que sea asi puedes usar
PasteSpecial mas o menos asi->

If celda <> "" Then
celda.EntireRow.Copy _
Worksheets("aqui nombre hoja destino").[a65536].End(xlup) _
.Offset(1).PasteSpecial xlPasteValues
End If

para ajustar las opciones de pegado echale un ojo en la ayuda al metodo
PasteSpecial y si tienes dudas comentas

espero te ayude en algo

un saludo
Ivan
Respuesta Responder a este mensaje
#4 David
21/02/2007 - 19:56 | Informe spam
Gracias por tu apoyo, Ivan. Acabo de revisar el foro, y veo tu aporte. Muy
bueno, pero sólo quisiera hacer un comentario. Yo programaba de esa forma,
pero tomando la escuela de uno de los Gurús de Office (Héctor), aprendí a
evitar el código para recorrer grandes cantidades de celdas. Es muy lento.
Tal vez fuera mejor algo como:

Cells(j, 1).EntireRow.Copy

y luego pegarlo:

Sheets(H2).Cells(i, 1).PasteSpecial

Pruébalo, y verás cómo se acelera el proceso. Más aún si utilizas

Application.screenupdate = false

al principio de tus procedimientos, y terminas con un

Application.screenupdate = true

;-)



"Ivan" escribió:

hola Ana, y David y resto de aforados

no estoy seguro de comprender la consulta, pero si lo que quieres es copiar
todas las filas de una hoja que contengan 'algo' en la columna 'J' en otra
hoja, tambien podrias hacer algo parecido a esto

Sub CopiarFilasSiJ()
Dim celda as Range, fin as Long
With Worksheets("Nombre de la hoja de origen")
' buscamos la ultima fila con datos en J
fin = .[J65536].End(Xlup).Row
' recorremos la columna J y copiamos las filas si J no esta vacia y
las pegamos
' en la primera fila libre de la hoja de destino. OJO-> mira las
notas despues del codigo
For Each celda In .Range("J2:J" & fin)
If celda <> "" Then celda.EntireRow.Copy _
Worksheets("aqui nombre hoja
destino").[a65536].End(xlup).Offset(1)
Next
End With
End Sub

NOTAS: 1) importante que en las dos hojas haya una fila de titulos o al
menos un dato en la columna J .
2) esta forma de copiar pega (creo) absolutamente
todo(valores, formatos, formulas,...), si no quieres que sea asi puedes usar
PasteSpecial mas o menos asi->

If celda <> "" Then
celda.EntireRow.Copy _
Worksheets("aqui nombre hoja destino").[a65536].End(xlup) _
.Offset(1).PasteSpecial xlPasteValues
End If

para ajustar las opciones de pegado echale un ojo en la ayuda al metodo
PasteSpecial y si tienes dudas comentas

espero te ayude en algo

un saludo
Ivan



Respuesta Responder a este mensaje
#5 Ivan
22/02/2007 - 01:28 | Informe spam
hola David, lo primero, muchas gracias por los consejos, no dudes que los
probare/comparare en cuanto tenga un rato, pero espero no te impor te que
comente un poco tu respuesta

Yo programaba de esa forma, pero tomando la escuela de uno de los Gurús de
Office (Héctor),





creo que de esa 'escuela' (aunque no estoy muy seguro de que el admitiera su
existencia) ya somos unos cuantos

aprendí a evitar el código para recorrer grandes cantidades de celdas.
Es muy lento





aqui, aunque estoy de acuerdo contigo, me temo que hay situaciones en las
que un bucle (del tipo que sea: For Each, Do ..Loop, For Next , ..) se hace
imprescindible. De hecho en el codigo que expones creo recordar un DO
..Loop.

de todas formas creo que para este caso en concreto posiblemente no hace
falta ( seguro que Hector tiraria de unos filtros avanzados, o en su defecto
unos autofiltros [ disculpad que no ponga un ejemplo, pero me acabo de dar
cuenta segun escribia este mensaje < y de hecho lo mismo estoy equivocado>],
copiando las filas con 'jotas' no vacias, de hecho posiblemente se puedan
evitar hasta las macros sin que suponga demasiado exfuerzo.

incluso creo que simplemente (via macros o no) con ordenar el rango por la
'J' y copiar hasta la ultima fila de 'J' que contiene datos podria valer
(repito: si la consulta de Ana iba por donde yo decia, que no estoy del todo
seguro)

la verdad es que a veces ( y hablo exclusivamente por mi) nos complicamos la
vida, cuando la solucion es la mas sencilla

Tal vez fuera mejor algo como:
Cells(j, 1).EntireRow.Copy
y luego pegarlo:
Sheets(H2).Cells(i, 1).PasteSpecial
Pruébalo, y verás cómo se acelera el proceso.



como te comentaba, ten por seguro que correre unas priebas, pero no estoy
del todo convencido de que sea generalizable, de hecho tengo la impresion de
que, a veces puede ralentizar mas el codigo el uso 'excesivo' de la notacion
por puntos, con lo que puede resultar mejor (creo y depende) asignar
variables para asi evitar el uso repetitivo de dicha notacion para referirse
a un mismo objeto, valor, etc,..

> Más aún si utilizas Application.screenupdate = false



he de reconocer que en los ejs. que suelo mandar al foro (casi) siempre se
me olvida incluirlo, pero tienes toda la razon

bueno lo dicho, muchas gracias, y espero que tomes esto como un simple
intercambio de puntos de vista/dudas. De hecho estare encantado si me
quieres aclarar cualquier punto...'oscuro'

un saludo y hasta pronto
Ivan

PD: Ana, si sigue al tanto del hilo, y lo que quieres hacer es lo que te
comentaba, toma en cuenta lo de ordenar por J

puedes usar el metodo Sort del objeto Range. De memori podrias hacer algo
parecido a esto

Sub CopiarJotas()
with worksheets("Nombre de hoja de origen")
.Usedrange.Sort Key1:=.[J2], Order1:=xlAscending
.Range("a2:J" & .[j65536].End(xlup).row).copy
worksheets("nombre hoja destino").[a65536].end(xlup).offset(1) _
.PasteSpecial xlPasteValues
end with
end sub

solo ten en cuenta algunos puntos:

a) el limite de filas (si tu excel es inferior al 2007) es de 65536
b) en -> .Range("a2:J" & .[j65536].End(xlup).row).copy -> he supuesto
que la ultima columna es la J, si no es asi cambia la 'J' del "A2:J" por la
letra de tu ultima columna (solo esa J, la otra dejala)
c) en la hoja de destino deberia haber al menos una fila de titulos ( o en
su defecto algun dato en la columna A) a partir de la cual, si no hay mas
registros te pegaria los datos.
d) si quieres restaurar el orden que tenias previamente, incluye otra
instruccion Sort antes del end With ( y si quieres tambien para la segunda
hoja, haciendo referncia a ella -> Workshhets("destino").usedrange.sort
...etc) cambiando en Key1 la columna por la que quiers que te ordene
e) ten cuidado con los posibles saltos/roturas de linea en el editor del
foro ( en mi anterior respuesta el codigo se habia truncado en un par de
sitios, pero es facil ver donde esta el 'salto'). Tambie puede haberseme
escapado algun error de sintaxis en este ultimo codigo, pues lo he escrito
aqui directamente. Si quieres comentas las dudas/problemas que te surjan

un saludo de nuevo y espero no haberte liado demasiado
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida