Hojas de cálculo en Excel - página principal

Recorrer fila a fila, una columna

A veces tenemos la necesidad de recorrer una columna, hasta llegar a la última fila que contiene datos, para insertar en la línea siguiente, un nuevo dato. Para recorrer una columna, fila a fila, hasta encontrarnos con la primera fila vacía, podemos utilizar este macro:


Sub recorrer_fila()
'Nos situamos en la celda con el primer dato
Range("A1").Select
'Hasta que no encuentre una fila vacía...
Do While Not IsEmpty(ActiveCell)
'Pues eso, hasta que no encuentre una fila
'vacía que baje una fila para abajo

ActiveCell.Offset(1, 0).Select
Loop
End Sub

Esta opción, lo que hace es recorrer cada una de las filas, hasta que encuentra una en blanco.

Ejecutando el macro anterior, recorreremos la columna, y la celda donde apareceremos será la primera que haya vacía. Si lo que deseamos es situarnos en la última fila con datos (en lugar de situarnos en la primera fila vacía) entonces, deberemos añadir estas líneas justo encima del end sub:

'Volvemos a la fila anterior
ActiveCell.Offset(-1, 0).Select

Otra opción para recorrer una columna, fila a fila, sería esta:

Sub recorrer_fila_de_otra_forma()
'Nos situamos en la celda con el primer dato
Range("A1").Select
'Bajamos hasta la última fila adyacente, que contenga datos
Selection.End(xlDown).Select
'Pasamos a la siguiente línea, que será una línea en blanco
ActiveCell.Offset(1, 0).Select
End Sub

Esta otra opción, lo que hace es bajar hasta la última fila de golpe, y situarse inmediatamente en la fila siguiente, que será una fila en blanco.

Si utilizamos este último ejemplo, y queremos situarnos en la última fila con datos (no en la fila siguiente, que será una fila vacía), nos bastará con utilizar este código:

Sub recorrer_fila_de_otra_forma()
'Nos situamos en la celda con el primer dato
Range("A1").Select
'Bajamos hasta la última fila adyacente, que contenga datos
Selection.End(xlDown).Select
End Sub



81 comentarios:

Rafael dijo...

Hola, estoy tratando de crear una macro a partir de "recorrer fila a fila una columna".
Tengo una hoja dentro de la cual existe una columna con nombres, en ese mismo libro tengo una hoja para cada nombre con una serie de datos (estos datos siempre estan en las mismas celdas en todas las hojas, pero los datos no estan en la misma fila o columna, es decir que el primer dato esta en la celda d3, el siguiente en la c8, el siguiente en la k25), lo que necesito es recorrer la columna de nombres y buscar su hoja con datos correspondiente, y luego poder asignar los datos a la fila que corresponde al nombre de la celda de la columna. Pero me encuentro con muchas dificultades porque no manejo con fluidez las funciones de VB.

Javier Marco dijo...

Prueba a ver si es esto lo que necesitas:

Sub recopilar_datos()
'Ocultamos el procedimiento
Application.ScreenUpdating = False
'Nos situamos en la hoja con los nombres de las hojas
Hoja1.Select
'Nos situamos en la celda donde está
'el nombre de la primera hoja
Range("A7").Select
'Recorremos la columna, hasta encontrar
'una fila vacía, que será el final de
'los nombres de las hojas (o pestañas)
Do While Not IsEmpty(ActiveCell)
'"Fichamos" la celda donde estamos
celda = ActiveCell.Address
'Buscamos la hoja con ese nombre
Sheets(ActiveCell.Value).Select
'Buscamos los datos de las celdas que nos interesan
dato1 = Range("D3")
dato2 = Range("C8")
dato3 = Range("K25")
'Volvemos a la hoja inicial
Hoja1.Select
'escribimos estos datos a la derecha
'del nombre de la hoja donde estábamos
Range(celda).Offset(0, 1) = dato1
Range(celda).Offset(0, 2) = dato2
Range(celda).Offset(0, 3) = dato3
'Bajamos una fila
ActiveCell.Offset(1, 0).Select
Loop
'Mostramos el procedimiento
Application.ScreenUpdating = True
End Sub

Salu2

Anónimo dijo...

Primero que todo, gracias por tu tiempo.
Lo he probado y me sale un error cuando lo ejecuto ("End Sub" expected); Adicionalmente creé un botón para ejecutar tu código y no se si eso pueda generar algún conflicto.

Saludos

Javier Marco dijo...

No debería darte error si has informado correctamente de la celda inicial, del nombre de la hoja donde tienes los nombres de las hojas, y si estos están correctamente escritos.

Te paso el ejemplo de antes en un fichero. Le he añadido una línea inicial (On error resume next), para que siga ejecutando el macro, incluso con errores.

Puedes descargar el ejemplo desde aquí (introduce los 3 caracteres que te aparecerán arriba a la derecha, para poder descargar el fichero).

Salu2

Rafael dijo...

Vale, no me funcionaba porque pensaba que en tu código lo que pone Hoja1.Select era el nombre que se le da a la hoja y no el orden que VB le asigna cuando se crea el libro; por lo tanto la solución fue cambiar Hoja1.select por Hoja8.Select.

Gracias

Javier Marco dijo...

Efectivamente. Tengo el vicio de usar los nombres VBA, para no encontrarme con sorpresas cuando alguien cambia el nombre de las hojas, y ver que los macros ya no funcionan, y dan error.

Me alegro que te haya servido.

Salu2

Anónimo dijo...

buenas tardes
consulta, tengo la base de datos que la alimento mediante macro pegandole valores de otra hoja.
por ejemplo tengo en la hoja1 la celda A2 con la siguiente formula:=si(A1="";"";A1) si la celda A1 esta vacia cuando copio A2 y la pego como Valores en la base de datos me la deja en blanco pero a la hora de buscar celdas vacias no me la reconoce como vacia entonces la proxima vez que quiera pegar buscando celdas vacias me dejaria un espacio entre una y otra

gracias por tu tienmpo y ayuda.

Javier Marco dijo...

Si no te he interpretado mal, lo que quieres es que aunque haya una fórmula, si esta no te devuelve ningún valor, es decir, "", entonces que la considere vacía, ¿no?. Bueno, prueba esto:

Sub prueba()
Range("A2").Select
Do While Not IsEmpty(ActiveCell)
If ActiveCell = "" Then
Exit Sub
Else
ActiveCell.Offset(1, 0).Select
End If
Loop
End Sub

Salu2

Anónimo dijo...

perfecto! justo lo que ocupaba, porque tenia casos de formularios con 30 lineas con "" y me dejaba muchos espacios entre uno y otro, gracias por la ayuda!

Javier Marco dijo...

De nada. Un saludo.

Julio Canel dijo...

Hola, encontre esta informacion en la red y esta buenisima.
Te molesto con una consulta:
Tengo datos en excel, compuesto por n filas & m columnas
quiero recorrer fila a fila la primera columna hasta encontrar la primera celda vacia,
una vez ubicada esta celda, ingresarle un dato cualquiera, y que en esa misma fila, pero
ahora de la ultima columna, me inserte el otro dato.
Cual seria la estructura que me ayudaria a hacer esto.

De antemano, muchas gracias!

Javier Marco dijo...

Gracias por tu comentario.

Prueba este macro:

Sub insertar_datos()
'Nos situamos en la primera celda con datos
Range("A1").Select
'Hasta que no encuentre una fila vacía,
'que vaya bajando filas
Do While Not IsEmpty(ActiveCell)
ActiveCell.Offset(1, 0).Select
Loop
'una vez situados en esa fila vacía
'ponemos un dato cualquiera
ActiveCell = "Estoy aprendiendo a hacer macros"
'escribimos el dato (por ej: 10,50) que nos interesa
'en la columna nº 5 (si es otra, cambia el 5, por
'el número de la columna que corresponda)
ActiveCell.Offset(0, 5) = 10.5
End Sub

Saludos.

Julio Canel dijo...

Gracias, me ha sido de gran utilidad tu asesoria, tengo otra consulta:

tengo el siguiente codigo

range("A1").CurrentRegion.SpecialCells(xlVisible).Select

Charts.Add
ActiveChart.ChartType = xlXYScatterSmooth
ActiveChart.SetSourceData Source:=Sheets("Hoja1").Range("A2:G14"), PlotBy:= _
xlColumns

¿como puedo hacer para que la seleccion que hacemos en la primera linea de codigo sea la que toma en cuenta en la parte de codigo que dice .Range("A2:G14), para que este no sea un valor fijo, sino que dependa de la seleccion del rango que hayamos echo inicialmente.

Agradeciendo nuevamente tu colaboracion, y felicitandote por compartir el conocimiento,

Julio Canel

Anónimo dijo...

hola,soy marta y tengo un problema qeunose como resolver, tengo una hoja excel qeu se genera aleatoriamente, megeera una matriz de nombre y datos, primero en 2 celdas combiadas me genera el nombre y debajo de este los datos que le corresponden a el como la fecha en una columna y en la otra un dato numerico qeu en ocasiones sale con un asterisco delante ppara diferenciarse de los demas, entonces lo qeu querria yo es que se mostraria de todos esos datos el nombre y solo la celda del nombre correspondiente qeu tenga el asterisco, he probado con autofiltros pero no me sale y conlas formulas tampoco llego a solucionar, he pensadoqeu seria con visual pero nose recorrero filas y columnas y qeu me muestre eso me podrias ayudar por favor, gracias de antemano..

Javier Marco dijo...

Gracias por tu comentario.

Prueba a ver si es esto lo que necesitas (como verás, no es nada difícil):

datos = Range("A1").CurrentRegion.SpecialCells(xlVisible).Address
Charts.Add
ActiveChart.ChartType = xlXYScatterSmooth
ActiveChart.SetSourceData Source:=Sheets("Hoja1").Range(datos), PlotBy:= _
xlColumns

Javier Marco dijo...

Para Marta:

Descárgate este ejemplo: http://www.megaupload.com/es/?d=VTPA02IB

Salu2

Julio Canel dijo...

Gracias Javier Marco, perdona la insistencia, con la opcion que te planteo, obtengo la curva tal cual la quiero, incorporandole la parte que me sugeriste, hace el proceso, toma el rango, pero me cambia totalmente la forma de la curva. No se si acá se puede postear imágenes para que le pudieras echar un vistazo a lo que quiero conseguir.

Anónimo dijo...

PERDONA SOY MARTA NO PUEDO DESCARGARME NADA DEL ARCHIVO NO SE QUE PASA SI ME LO MANDAS A MI CORREO
AYAKO878@HOTMAIL.COM, GRACIAS POR TU AYUDA UN SALUDO.

Javier Marco dijo...

Para Julio:

Mándamelo a este correo mikorreo*gmail.com (sustituye el * por @)

Para Marta:

Enviado por email.

Salu2

Anónimo dijo...

hola, me ayudaste con esta macro a lo que le agregue un par de lineas

Sub prueba()

Sheets("BASE DE DATOS").Range("a7").CurrentRegion.Copy

Range("A25").Select
Do While Not IsEmpty(ActiveCell)
If ActiveCell = "" Then
Exit Sub
Else
ActiveCell.Offset(1, 0).Select
End If
Loop

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False

End Sub

me funciona bien con las dos lineas que agregue pero solo la primera vez que ejecuto la macro, la segunda vez que la ejecuto me copia los datos, me busca la celda con valor "" pero no me pega los valores y de ahi no pasa.

gracias por la ayuda que me puedas dar

Javier Marco dijo...

Prueba de esta otra forma:

Sub prueba()
Sheets("BASE DE DATOS").Range("a7").CurrentRegion.Copy
Range("A25").Select
Do While Not IsEmpty(ActiveCell)
ActiveCell.Offset(1, 0).Select
Loop
Selection.PasteSpecial Paste:=xlPasteValues
End Sub

Salu2

Anónimo dijo...

Información interesante.

¿Cómo puedo recorrer una fila pero cuando se aplica un filtro?

Javier Marco dijo...

Exactamente igual. Da lo mismo que haya filtros o que no, porque este artículo trata sobre como posicionarnos en la primera fila libre que nos encontremos.

Salud

Anónimo dijo...

Hola:

Disculpa que insista, tal vez podrìa ser un tema que se podría desarrollar, pero cuando apliqué lo que indicabas, y a pesar de que las primera filas no se muestra porque no cumple la condición del filtro, cuando utilizo el offset la celda que se selecciona es una de las que estàn ocultas.

¿Cómo puedo recorrer las filas una a una en la misma forma en que se presenta en la hoja?

Gracias por la atención

Javier Marco dijo...

Pues lo que me comentas es imposible, pues la condición para que deje de ejecutarse el bucle del macro, es que se encuentre con una fila vacía, y una fila oculta siempre será una fila con datos (siempre y cuando haya algo en esa fila oculta, claro).

Te paso un ejemplo para que veas que con filtros funciona igual. Puedes descargarlo desde este enlace: http://www.megaupload.com/es/?d=ROOIDWZ9

Salu2

Anónimo dijo...

Hola amigo, excelente post, una pregunta, estoy intentando crear un macro en un archivo, este debe abrir otro con data (variable en nombre y numero de informacion) y crear desde el segundo un archivo txt con cierta informacion del archivo abierto (no toda) hasta ahora sólo he podido abrir el archivo, pero no puedo hacer procesos sobre el abierto sino solo sobre el que tiene el macro, crear el txt lo mismo, lo crea en base al que tiene el macro y no al abierto por él, si puedes ayudarme te lo agradecería, te pregunto porque además necesito recoerrer el archivo abierto para identificar el numero de filas que posee (las columnas si son fijas), pero igual, me cuenta las existentes en el que tiene el macro y no en el que abre.

gracias

Anónimo dijo...

hola que tal mi pregunta es como le puedo hacer para recorrer las filas de una columna y al momento de llegar al final posicionarme en la primera posicion de la segunda columna y asi sucesivamente

Anónimo dijo...

tengo el siguiente problema, recorro una columna y selecciono una fila y la quiero "marcar" para ello utilizo pepito = activecell.address y luego recorro otra columna y selecciono otra fila a la cual marco con celda2 = activecell.address hasta aca no tengo drama, el problema me surge cuando quiero escribir un if en el cual hago referencia a esas dos celdas "marcadas" y no me tomas los contenidos, es decir la opcion que le doy al if para cuando la condicion se cumpla, la cual puede ser pepito > celda2, no la realiza, realiza la opcion como si la condicion no se cumpliera, tenes idea en donde puede estar el error, gracias desde ya

Javier Marco dijo...

En lugar de llamar a la condición así:

if pepito > celda2 then ...

llámala así:

if range(pepito) > range(celda2) then ...

Saludos.

Diego M dijo...

hola que tal Javier tengo una pregunta tengo un archivo que tiene en una celda el nombre del producto a delante tengo los ingresos y abajo los ingresos las asistencias lo que quiero es en la primera celda el nombre, en la celda de adelante las asistencias y la siguiente celda ingresos, en si lo que quiero es subir las asistencias y ponerlo en medio de el nombre y los ingresos. son varios producto y con sus asistencias y ingresos Saludo

Anónimo dijo...

hola
estoy intentando hacer una macro en la cual tengo la siguiente informacion

tengo varias columnas, la primera esta nombrada por meses, ahi estan incorporados mes, estan ordenados,y en cada fila contienen informacion distinta. lo que yo quiero que haga la macros es lo siguiente
QUE BUSQUE EN LA COLUMNA DE MESES YA SEA ENERO Y ME COPIE TODA LA INFORMACION QUE CONTENGA ESA FILA, ASI SUCESIVAMENTE CON CADA FILA QUE CONTENGA ENERO, Y LA PEGUE EN OTRO HOJA QUE SE LLAMARIA ENERO.

ESTE MISMO CASO PARA CADA MES

LO QUE SE REQUIERE ES LLEVAR COMO QUE UN CONTROL POR MES EN CADA HOJA

ME PODRIAS AYUDAR

Javier dijo...
Este comentario ha sido eliminado por el autor.
Javier dijo...

Hola, he leido este comentario, pero no soy capaz de adaptarlo para mi proposito:
Seria rellenar las celdas vacias con el valor de la celda anterior.
Es decir:
Ciudad - nombre - precio
---------------------------------
madrid - jose - 100
(vacio)- javier - 300
(vacio)- (vacio)- 400
Leon - luis - 100
(vacio)- (vacio) -200
--------------------------------
Necesitaria rellenar los valores en blanco con su inmediato superior
Saludos y gracias por esta pagina

Javier Marco dijo...

Créate un bucle, por ejemplo hasta la fila 100 o la que desees, y que tenga un aspecto así:

Sub prueba()
Range("A1").Select
For i = 1 To 100
If ActiveCell.Row <> 1 And ActiveCell = "" Then
ActiveCell = ActiveCell.Offset(-1, 0)
End If
ActiveCell.Offset(1, 0).Select
Next
End Sub

Javier dijo...

¡ perfecto Javier Marcos ¡

Perdona el abuso, pero ¿habría forma de decirle hasta la primera fila que se encuentre vacia?

Y segunda petición, ya para "rizar el rizo"
¿que me pregunte en que columna quiero hacerlo y/o hasta que fila?

Saludos y muchas gracias

Posdata:
Sino estaria claro seria
ir sustituyendo las sentencias
Range("A1").Select ---> la columna que quiera
For i = 1 To 100 --> el 100 por la que necesite

Javier Marco dijo...

Vamos a ver...

¿Quieres que eso se ejecute hasta la primera fila vacía que encuentre?. Hummmm, la primera fila vacía que encuentre, será la fila 2, porque la fila 1 tiene dato, la fila 2 no, la 3 sí, la 4 no, etc...

Con lo cual, tienes que plantear un final (en el ejemplo anterior 100 filas).

Por otro lado, sí que se puede hacer lo que pides, pero te dejo que lo investigues. Usando por ejemplo un inputbox, se puede preguntar al usuario la columna que deseas recorrer. Si no quieres preguntar la columna, directamente si te sitúas en una celda de una columna, podrías ejecutar el macro para esa columna (la de la celda donde estás situado). Es decir, si estás situado en la celda C4, el macro que te pasé se puede modificar, para que de forma automática lo aplique a las 100 primeras filas de la columna C, sin necesidad de decirle que es esa columna, pues el macro se ejecutaría en la columna de la celda donde estemos situados.

En este blog hay ejemplos de todo eso, así que te dejo que lo investigues.

Javier dijo...

ok gracias Javier Marcos, sigo investigando. Saludos y reitero mi agradecimiento.

miguelrdr dijo...

Consulta:
tengo dos sheets de excel, en la hoja1 tengo una base de datos cuya columna A tiene un valor respectivo en la columna B, y en la hoja 2 quiero consolidar por cada valor de la columna A todos los valores respectivos en la columna B. el asunto es el siguiente, si por ejemplo en la col"A" tengo una actividad llamada comprar carbon, para esta actividad tengo 7 entradas en diferentes filas de la col"B", por ende en la col"A" hay 7 veces en 7 filas no necesariamente consecutivas el valor "comprar carbon", lo que necesito es una macro que me permita coger los 7 valores de la col"B" y copiarlos en la COL"B" de la hoja2 y que me deje el activecell en la siguiente fila del Col"A" del hoja2. Yadicionalmente yo podré darle al boton para que ejecute otra vez la macro con la seleccion que haga en la activecell de la col"A" de la hoja2.

Espero me entiendan.

Best regards

carlos ladino dijo...

amigo necesito un favor, tengo el siguiente codigo para leer los datos de abajo hacia arriba hasta encontrar la primera celda llena, pero necesito realizar varias veces este procedimiento por lo cual escribo LasRow4 , 5 , 6 y asi sucesivamente, hasta un momento en que no funciona mas, creo que es el LastRow7... que puedo hacer para que todos los LastRow que quiera colocar en un mismo procedimiento me funcionen?? gracias , agradezco tu respuesta...


Sheets("JUNTOS").Select
Dim LastRow4 As Long
LastRow4 = Sheets("JUNTOS").Range("A1048576").End(xlUp).Row + 1
Cells(LastRow4, 1).Select
ActiveCell.Offset(0, 15).Select
celdaactiva = ActiveCell.Address
Range("A11:" + celdaactiva).ClearContents
Range("A1").Select

Anónimo dijo...

sólo comentar que me resulta muy pero que muy muy útil este blog. Muchas gracias por tu tiempo. Eres una Machine. (Fdo: EMO)

Diego F.Davies dijo...

Buenísimo tu blog, nos fue muy útil.Buena idea la de hacer un blog sobre algo tán práctico como el excel.

Christiam dijo...

Antes que todo muchas gracias por ayudar a los que no somos tan capos en macros :D

Ojalas me pudieras ayudar.
Tengo un excel con aprox. 15 mil registros y tengo que cambiar el formato de fecha a la columna "fecha de nacimiento".
he aplicado metodos como pegado especial, y formato de fechas; pero lo extraño es que no me cambia ninguna celda.
Pero, al hacer doble clic en la celda automaticamente se cambia al formato de fecha deseado y previamente establecido por mi(dd/mm/yyyy).

Como puedo hacer una macro.
que recorra la columna, y que haga doble clic automaticamente en todas las filas para que se arregle el formato ?

te agradecer enormemente si me puedes ayudar.

Gracias

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

Ejemplo:

Original.

4-3-1960

Aplico formato (dd/mm/yyyy)

resultado

4-3-1960

pero al hacer doble clic encima de la celda cambia a...

04/03/1960 que es lo correcto.

favor te agradecer si me ayudas a automitar esta tarea

Javier Marco dijo...

Hola Christiam. Pues afortunadamente, yo me he encontrado con alguna situación parecida a la tuya, y por eso en su día preparé un macro que recorre toda una columna, hasta encontrar una fila vacía. Aquí lo tienes:

Sub Eliminar_espacios_vacios_por_la_derecha()
On Error GoTo Fin
'Desactivamos las teclas de cancelación de macros
Application.EnableCancelKey = xlDisabled
'Ocultamos los pasos que efectúa el procedimiento
Application.ScreenUpdating = False
'Nos situamos en la celda A4
Range("A4").Select
'Que no se pare de buscar, hasta que no encuentre una fila vacía
Do While Not IsEmpty(ActiveCell.Offset(0, 0))
ActiveCell.Offset(1, 0).Select
'que extraiga solo los 9 primeros caracteres (por eso comienza
'por la izquierda), y que los ponga en la celda
ActiveCell.Select
ActiveCell.FormulaR1C1 = Left(ActiveCell, 10)
ActiveCell.Select
Loop
Range("A5").Select
'Mostramos los pasos que efectúa el procedimiento
Application.ScreenUpdating = True
Fin:
End Sub

Rodrigo dijo...

Hola Javier Marco:
Me encuentro con una situación similar a la de Christiam, aunque yo lo que necesito es que vaya entrando celda a celda, hasta que encuentre la 1º celda vacía, y meta un "ENTER", con lo que me mantendría el valor original de la celda, probé utilizando la macro que le pusiste a Christiam, cambiando:
ActiveCell.FormulaR1C1 = Left(ActiveCell, 10)

por

ActiveCell.FormulaR1C1 = vbKeyRetun

Pero se me detiene en la 1 celda y me la deja en blanco.

También probe con:

Sub Macro5 ()
Range("G2").Select
Do While Not IsEmpty(ActiveCell)
ActiveCell.FormulaR1C1 = vbKeyRetun
ActiveCell.Offset(1, 0).Select
Loop

End Sub

con esta ultima consigo recorrer toda la columna hasta el primer hueco en blanco, pero al igual que en el caso anterior, me borra o modifica el valor de la celda, no me mantiene el valor original.

Es pero puedas ayudarme.
Un saludo y gracias por adelantado.

Javier Marco dijo...

Prueba a meter ese código, en lugar de hacerlo dentro de un bucle do while, en un for.

Por ejemplo así:

Sub Macro5 ()
Range("G2").Select
'para las 1000 primeras filas
For i=1 to 1000
ActiveCell.FormulaR1C1 = vbKeyRetun
ActiveCell.Offset(1, 0).Select
Next
End Sub

Anónimo dijo...

Hola Javier Marco, ante todo te agradecere me puedas ayudar con mi problemilla, mi nombre es Carmen, yo tengo creada una macro que me contabiliza los datos de la hoja 1 x decirlo asi y me arroja la respuesta en una hoja 2, el detalle es q ahora necesito que me arroje la respuesta en la hoja 2 pero de acuerdo al filtro que active en mi hoja 1, esto sera posible?, agradecere tu respuesta

gustavo dijo...

hola, ojala me puedas ayudar con lo siguiente: tengo un libro con tres hojas: cheques, vencimientos, caja. En la hoja vencimientos tengo los cheque ordenados por fecha de vencimiento desde la fila 2 a la 60, lo que quiero hacer es que cuando en la celda k2 escriba "cobrado", la macro pase el contenido de las celdas e2 y h2 a la hoja caja en la columna b y c respectivamente, pero como también en la hoja caja se ingresan datos manualmente (gastos, retiros efectivo, etc) debería buscar la primer fila vacía. Después deberían acreditarse las fila 3 , 4 , 5 hasta la 60 de la hoja vencimientos. Siempre que en la columna k de la respectiva fila este la condición de "cobrado"
Desde ya gracias por tu valioso tiempo. Gustavo

Ricardo dijo...

Hola Javier Marco soy Ricardo J, Espero me puedas ayudar, los empleados de mi grupo llenan a diario una bitácora en excel donde registran o actualizan en una fila el estado de los proyectos que estan trabajando. Todos los archivos tienen la misma estructura y encabezados. Quiero construir la misma bitacora para el Jefe de tal forma que abra un archivo y le de algo asi como actualizar en ese momento una macro borre la hoja activa menos los encabezados, abra la primera bitacora con el nombre "bitacora.fulano" , en la celda B1 escriba "fulano" y luego copie cada cada contenido del primer proyecto de fulano de la celda B2 hasta Bn (n es la ultima celda llena de la primera fila en el archivo "bitacora.fulano"), luego haga lo mismo para el segundo proyecto ect.. hasta la fila que encuentre vacía; cierre el archivo "bitacora.fulano" y ahora abra "bitacora.otro" haga lo mismo y copie desde donde quedó la copia anterior, asi hasta que acabe los archivos "bitacora.xxxx" del directorio donde está. Al final el jefe debe tener el listado de todos los proyectos de su grupo en una sola hoja y debe poder crear reportes con una tabla dinamica en otra hoja del mismo libro, ese reporte no debe ser borrado al ejecutar de nuevo la macro sino en cualquier momento actualizar. Gracias de antemano espero haberme dado a entender.

luty dijo...

hola
necesito ayuda....
tengo muchos datos en la columna "a" tal cantidad de datos excede de 1000, y a esos datos (números) de la columna "a" necesito aplicar una operación matemática y que el valor quede en la columna "b", lo que hice fue en la columna "b" colocar la ecuación =a1*3.3/1024, el problema es que tengo que hacer eso fila por fila y mi idea es que se haga solo ya sea recorriendo la columna o fila ... agradecería ayuda

saludos

nana dijo...

Hola, tengo el siguiente problema y nose sipuedas colaborarme tengo 3 columnas asi:
A B C
101 1 400
101 1 500
102 1 50
102 2 30
102 3 60
102 4 80
necesito que pregunte si la primera fila es igual a la siguiente y si es asi que me diga cuan es el maximo de la columna B y me copie el dato de la C Y asi sucesivamente con el resto de filas..gracias por su ayuda

daniela dijo...

hola necesito ayuda lo que pasa es que necesito recorrer una columna y cuando escuentre una celda vacía que pase a la columna siguiente

Luis dijo...

tengo en excel el siguiente codigo en el cual selecciono un archivo.xls (el que yo deseo) despues de que abro este excel quiero traspasar todo lo que tengo en la columna A y C (no quiero B)a otro archivo de excel llamdo Datos.xls y las columnas que tome de archivos.xls se pegen o copien en Datos.xls en la columna B y D eliminando la columna A y C del archivo seleccioado
te estaria totalmente agradeciodo


Sub leer_fichero_excel()
'Ocultamos el procedimiento
Application.ScreenUpdating = False
'Si hay errores, que siga
On Error Resume Next
'Definimos las variables:
'indicamos la ruta del fichero donde nos conectaremos,
'y que en este caso, será la misma que
'la de este fichero que contiene el macro
Fichero = Application.GetOpenFilename("Archivo , xls.*", , "SELECCIONAR ARCHIVO.")
If Fichero <> False Then 'Exit Sub
'Creamos el objeto conexión
Set Conn = New ADODB.Connection
Conn.Open "DRIVER={Microsoft Excel Driver (*.xls)};DBQ=" & Fichero
'Creamos el objeto recordset
Set rs = New ADODB.Recordset
'Seleccionamos los datos
'Sql = "SELECT * FROM A4:C35"
'Escribimos los datos
'rs.Open Sql, Conn, adOpenStatic, adLockOptimistic
'Traemos los datos, para lo cual
'y los escribiremos
'Range("C1").Select
'Ahora seguimos con los datos, hasta acabar
'con los datos que nos devuelve la consulta
Do While Not rs.EOF
ActiveCell.Offset(1, 0) = rs(0)
ActiveCell.Offset(1, 1) = rs(1)
ActiveCell.Offset(1, 2) = rs(2)
'nos movemos al siguiente registro
rs.MoveNext
'bajamos una fila
ActiveCell.Offset(1, 0).Select
Loop
'cerramos y limpiamos los objetos
Workbooks.Open (Fichero)
rs.Close
Conn.Close
Set rs = Nothing
Set Conn = Nothing
'Mostramos el procedimiento
Application.ScreenUpdating = True
End If
End Sub

este codigo lo tome de tu blog
gracias

Irlanda dijo...

Hola Javier,

Lo primero darte la enhorabuena por este blog. Nos ayuda enormemente a los patosillos que estamos empezando con esto de las macros.

Después de bucear mucho para intentar encontrar respuesta a mi problema, más o menos he encontrado este artículo que me ayuda a lo que necesito, pero cuando aplico las macros no me terminan de salir.

Te cuento mi problema por si me puedes ayudar.

Tengo una macro bastante compleja que me funciona por completo menos en una parte.
Mediante un inputbox introduzco en la celda a1 una fecha. Después en la columna I le digo que desde la fila 8 (donde empiezo a tener datos) haga esta fórmula: d8-$a$1. Cuando intento que me arrastre la fórmula hasta la última línea que tenga datos, no me sale.
He utilizado esta función:
Range("I8").Select
ActiveCell.FormulaR1C1 = "=R1C1-RC4"
Range("I8").Select
("I8").CurrentRegion.Copy
Do While Not IsEmpty(ActiveCell)
'Pues eso, hasta que no encuentre una fila
'vacía que baje una fila para abajo
ActiveCell.Offset(1, 0).Select
Loop

Estas funciones las he encontrado en tu blog, pero seguro que las estoy aplicando de forma incorrecta, porque no hace nada y en la función ("I8").CurrentRegion.Copy, me dice que hay un error de compilación, y ahí me quedo atascada.

Si me pudieses ayudar te lo agradecería mucho, aunque seguiré buceando por tu blog por si encuentro algo más y consigo que me funcione.

Anónimo dijo...

Saludos Javier...
Podrias por favor ayudarme con algo, como hago para que al abrir un archivo automaticamente una macro revise en una columna si alguna celda contiene o no un valor (en este caso si contiene valores mayores a 4) y si es afirmativo que muestre un mensaje de alerta con las celdas que cumplen esta condicion.

Muchas gracias por tu ayuda.

. dijo...

Hola.
tengo una lista, con las colunnas: A,nº de orden.
B, dni.
C,nombre
y D,fecha
en la hoja llamada año anterior.
Y en otra hoja llamada año actual, al introducir un dni en una celda B8; me muestre en una nota de color verde, si este ya esta introducido en la lista del año anterior.
Y que en base al dni introducido en la celda B8, que extraiga de la lista situada en la hoja año anterior.y lo coloque El nombre en la celda C8 y la fecha de nacimiento en la celda D8, que corresponden al dni,introducido en la celda B8, y luego que copie el dni,el nombre y la fecha,en una lista a partir de la celda B10, C10 y D10 en la hoja que estoy situado de año actual.y se situe a la espera de introducir un otro dni en la celda A8.Si por el contrario el dni no esta en la lista del año anterior y es nuevo, con una nota en color rojo, me pida introducir:
en las celdad, C8,el nombre
y en la celda D8 la fecha de nacimiento
y una vez introducido
coja este nuevo dni nombre y fecha y lo introdusca en la lista de la hoja año actual. a continuacion de los registros que ya estan introducidos, quedando a la espera otra vez en la celda B8.para comprobar otro dni.la intencion es ver si al introducir un dni en la celda B8 este ya lo tengo registrado o tengo que introducirlo como nuevo, quedando registrados en la lista año actual todos los dni que introdusca en la celda B8.
Lo que mas me gustaria es que la lista que se crea en esta hoja de año actual,se fuera desplazando y se mostraran siempre en pantalla al menos, los ultimos 10 registros introducidos de la lista.
Si tienen alguna duda,pregunten.

y la espera de noticias vuestra me despido.

cesar dijo...

Tengo 3 columnas

a b c
1 3
2 2
3 1

En la columna c quiero poner un formula rounddown y que se detenga hasta encontrar la celda vacia, ya sea de la columna a o b.
Como le hago gracias

Javier Marco dijo...

Como no se muy bien que quieres redondear, aquí te pongo un ejemplo de un macro que haría la media de los valores de las dos columnas precedentes (A y B).

Sub Ejemplo()
'ocultamos el procedimiento
Application.ScreenUpdating = False
'Nos situamos en C1
Range("C1").Select
'Si las dos columnas anteriores contienen
'datos, entonces ponemos el promedio
'de ambos en la columna C
Do While ActiveCell.Offset(0, -1) <> "" And ActiveCell.Offset(0, -2) <> ""
'ponemos la media
ActiveCell = "=AVERAGE(RC[-2]:RC[-1])"
'bajamos una fila
ActiveCell.Offset(1, 0).Select
'seguimos con el bucle
Loop
'mostramos el procedimiento
Application.ScreenUpdating = True
End Sub

Saludos.

Abelardo dijo...

Buenas tardes, necesitaria si alguien fuese tan amable me indiacse una macro para una una hoja que tengo , en la cual necesitaria, que si la columna c y la e de la misma fila tiene algún dato, en la columna d me pusiese un 1 si es que esta vacia la d si esta llena que la deje como esta. Gracias

Javier Marco dijo...

Hola Abelardo. Mira a ver si esto es lo que buscas:

Sub ejemplo()
'si hay errores, que continúe
On Error Resume Next
'ocultamos el procedimiento
Application.ScreenUpdating = False
'nos situamos en la primera celda
Range("C1").Select
'vamos a hacer esto, para 2000 filas
For i = 1 To 2000
'comprobamos el valor de C y E
If ActiveCell <> "" And ActiveCell.Offset(0, 1) = "" And ActiveCell.Offset(0, 2) <> "" Then ActiveCell.Offset(0, 1) = 1
'bajamos una fila
ActiveCell.Offset(1, 0).Select
Next
'mostramos el procedimiento
Application.ScreenUpdating = True
'volvemos al principio
Range("C1").Select
End Sub

Saludos.

Abelardo dijo...

hola, buenas tardes soy Abelardo, comunicarte que la macro que me habeis hecho es perfecta.
MUCHISIMAS GRACIAS

Abelardo dijo...

Buenos días, soy Abelardo de nuevo ,en vista del éxito que tubo tu macro de la anterior vez, meatrevo a pedirte otro favor aunque puede que te parezca que soy algo pesado.
Seria posible que con una macro o algo similar que si pincho en una celda del libro1 me salga un box o directamente pincando en la celda, en el/la cual pueda introducir un dato y que al introducir el dato y pulsar aceptar me vaya a otro libro y me copie las linea donde este ese dato y me la pegue en la linea donde haya introducido el dato.

Esto si es un reto verdad??
gracias

Leibnithz dijo...

Muy buenas noches,
De antemano muchas gracias por su tiempo.
Necesito lo siguiente:
tengo una base que tiene
identificacion, nombre, y nombre archivo.
las identificaciones se repiten en la base con mucha frecuencia.
Tengo un Userform con
un textbox que es donde va la identificación.
Necesito que el combobox cargue los nombres de los archivos, que pertenecen a la identificación del textbox, mejor dicho que el textbox sirva de filtro para los datos del combobox.

Nuevamente muchas gracias

Anónimo dijo...

Buenas tardes, mi mptivo de este comentarios es el siguiente:

tengo en una columna 100 trabajadores los cuales pueden estar repetidos, y cada fila (cada trabajador)tiene 5 columnas con datos (importes númericos), quisiera saber si existe alguna formula o macro para saber si al estar duplicado un trabajador, todas sus columnas tambien estan duplicadas,ya que puede existir diferencia en una misma columna aun tratandose del mismo trabajador.

Anónimo dijo...

Saludos y felicidades muy buena pagina, bendiciones y agradecimiento por el apoyo brindado desinteresadamente. Similar a la consulta anterior, tengo una hoja llamada datos en la cual hay codigos, articulos y precios, quisiera automatizar el proceso con una macro de tal forma que si con Ctrl+B busco un articulo selecciono su codigo y con un comand button (macro) me desplege un formulario en el cual elegir de una lista, una (1) de todas las hojas(20 hojas) y al pulsar aceptar me copie el codigo en la ultima fila de la columna C similar al archivo recorrer fila.

Nuevamente agradeciendo mi correo pieroap21@hotmail.com

rIcKy dijo...

Hola.. mi consulta es la siguiente.. trabajo con reportes jasper y luego exporto mis datos a excel 2003, como bien sabemos el maximo de filas de excel es de 65536 y en ocasiones estos reportes superan esa cantidad de filas.. lo que quisiera hacer es que al llegar a 65536 me muestre los datos en la columna de al lado a partir de la fila 1.
Osea si por ejemplo mi reporte utiliza desde la columna a hasta la f, y al llegar a la fila numero 65536 automativamente empice en g hasta l desde la fila 1..
Se entiende?es posible esto?
También sé que con excel 2007 tengo mas de 1.000.000 de filas pero esa solucion no la puedo aplicar en este momento.

André Gonzales dijo...

Hola, quisiera que me ayudaras con una macro. Mira yo tengo una columa que es desde la E4 hasta la E25 llena de nombres lo que quisiera es crear 4 botones. El primer boton "Buscar Primero" que me busque el primer registro en este caso el que esta en la celda E4. El segundo boton seria "Buscar siguiente" que avanze desde E4 hasta E25 y que se detenga y ya no avance mas y que no se salga de ese rango. El tercer boton seria "Buscar anterior" que haria lo mismo que el segundo solo que no avanzaria sino que retroceda hasta lleguar al E4 y q se detenga ahi y no retroceda mas. El cuarto y último boton seria "Buscar último" que me buscaria el ultimo nombre que estaria en la celda E25. Bueno ese es mi problema no se como hacerlo, recien estoy empezando en esto de las macros y quisiera su ayuda please, gracias de antemano se que me ayudaran.

ANGEL dijo...

Hola amigo experto tengo una duda en excel sobre recorrer la fila en una columna espero me puedas ayudar tengo la celda A1 en la cual escribo muchos valores y quiero que en la "hoja2" celda A2 se pegue el valor,y que cuando siga metiendo valores en la celda A1 me pegue el valor en la celda A3 de la hoja2 y asi sucesivemte.

Javier Marco dijo...

Copia este procedimiento dentro de la hoja donde vayas a escribir los valores (no en un módulo):

Private Sub Worksheet_Change(ByVal Target As Range)
'Ocultamos el procedimiento
Application.ScreenUpdating = False
'Miramos si estamos cambiando la celda A1
If Target = Hoja1.Range("A1") Then
'añadimos el dato en la hoja2
Hoja2.Select
Hoja2.Range("A2").Select
Do While Not IsEmpty(ActiveCell)
'bajamos una fila
ActiveCell.Offset(1, 0).Select
Loop
'escribimos el dato de la hoja1
ActiveCell = Hoja1.Range("A1")
End If
'volvemos a la hoja1
Hoja1.Select
'Mostramos el procedimiento
Application.ScreenUpdating = True
End Sub

Saludos.

Alexsc dijo...

Hola Javier:

Te felicito por tu enorme espiritu de colaboración en esto de las macros en Excel, pues guiandome con tus ejemplos he logrado resolver muchos temas.

Quisiera pedirte me ayudaras en lo siguiente: Tengo una plantilla en excel en el que se empiezan a introducir datos a partir de la celda A3 hasta la U3 y baja hasta la celda U11. Esto equivale a un registro.

Dentro de este rango, en la columna A (A3 hasta A11), se deben ingresar datos seleccionados de una lista desplegable que traigo desde otra hoja.

La idea es que una vez se hayan llenado las celdas en este rango de la columna A (A3 hasta A11), se presione un boton para que me pegue una nueva "plantilla" que traigo desde otra hoja, es decir, un nuevo registro (conformado por 9 filas) a partir de la celda A12 con el fin de diligenciarlo, y asi sucesivamente cada 9 filas...

Ya tengo el boton con este codigo:
Private Sub CommandButton1_Click()
fila = Range("A3").End(xlDown).Row
Sheets("Plantilla").Visible = True
Sheets("Plantilla").Range("a1", "U" & fila - 2).Copy
Sheets("Base Plano").Select
Range("a" & fila + 1).PasteSpecial
Application.CutCopyMode = False
Range("a" & fila + 1).Select
Sheets("Plantilla").Visible = False
End Sub

Pero resulta que si dentro del rango de las 9 celdas (A3 hasta A11) encuentra una celda en blanco (por ejemplo A8), a partir de la siguiente (A9) me pega las filas para el nuevo registro, borrandome lo que habia ingresado del registro anterior.

Lo que necesito validar es que me pegue cada plantilla nueva justamente despues de la ultima fila existente en la hoja, sin importar si dentro del rango de las 9 filas anteriores existe alguna celda en la columna A que este vacia

Espero haberme hecho entender...

Te agradezco muchisimo tu valiosa colaboración

Javier Marco dijo...

Podrías escribir en una celda el bloque por el que vas. Es decir, si has insertado 4 veces datos desde el formulario, entonces habría que contar que el salto desde A3, sea este:

fila_donde_escribimos = 3 + (9 * 4)

Como aquí la variable es ese 4 que aparece (los otros datos son fijos), lo podrías pasar a una variable global que siempre estuviese disponible, pero el problema es que cuando cerrases el libro, y lo volvieses a abrir, esa variable global se reiniciaría.

Por eso, lo mejor es que ese 4 (que será un contador en el que sumarás 1, cada vez que envíes los datos desde el formulario, por lo que ahora será 4, luego, 5, la vez siguiente 6, etc.) lo pongas en una celda, bien de forma oculta, o bien con texto de color blanco, como el fondo de la hoja.

Es lo que se me ocurre así a bote pronto.

Saludos.

Carlos David dijo...

Hola, espero que me puedas ayudar con esta macro, tengo datos en la fila columna "b", quiero que copie y pegue el primer dato de la columna B (B1) en "A1" X numero de veces, desps en la en la ultima celda vacia de la columna A me pegue X numero de veces el valor siguiente de la columna "B" (B2) y asi sucesivamente, espero me puedas ayudar.

Carlos David dijo...

Aqui va una explicacion mejor de mi problema, tengo 50 datos en la columna B (B1:B50), lo que deseo, es que a partir de la primer celda de la columna A (A1) me pegue 10 veces(de A1:A10) el primer dato de la columna B (B1) despues me pegue EN (a11:a20) 10 veces el siguiente dato de la columna B (B2), espero que esta explicacion sea mas clara :) muchas gracias por tu apoyo y espero tu respuesta.

Anónimo dijo...

Hola. Muchas gracias por toda esta info!.
Quiero crear una macro que recorra una fila con un rango determinado pero que al encontrar una celda vacía la salte y continúe con la siguiente. Al obtener estos datos volcar todo a un archivo de texto plano. Me podrías orientar un poco en esto? gracias, mis saludos!

María Luisa Eslava dijo...

Hola Menos mal te encontré, creo que me puedes ayudar. No se cuál es el nivel de dificultad de lo que necesito

Tengo una matriz de doble entrada. (la primera columna es un encabezado y la primera fila es un encabezado). La cuestión es que la matriz es grande.

Lo que necesito es que al ubicarme en cualquier celda de la primera fila, pueda seleccionar un valor del encabezado de la primera columna y se desplace hacia dicha columna sin cambiar de fila.

Espero no haber sido muy enredada y de antemano gracias por tu colaboración.

FERNANDO dijo...

Buenos días, mi nombre es Fernando, tengo una lista de personas y telefono, y quiero que empiece por el primero, me lo copie en otra hoja, donde tengo una macro que me permite enviar através de Outloock un SMS, (através de un proveedor contratado), y necesito que comenzando desde el inicio, siga la lista, dando tiempo para la ejecución de la macro de envio.
Os felicito por el blog, es muy interesante. Estoy comenzando con las funciones de VB.
Gracias

Jaime dijo...

Primero felicitaros por el blog. Y ya metidos en faena os comento tengo dos libros y quiero recorrer los valores de la columna A y buscar dichos valores uno a uno en el otro libro también en la primera columna. Una vez localizado copiar esa fila a la posición correspondiente del primer libro en caso de no encontrar nada pasaría al siguiente hasta acabar la lista Un saludo

LuCas dijo...

saludos, esta muy buena la info. queria pedirte una ayuda, resulta que tengo en una columna unos valores establecidos (columna A) en otra columna valores no fijos (columna B) , diseñe una macro para que de acuerdo a la accion de la columna B se ejecute la columna A en otra hoja del libro, si por ejemplo en columna B dice Sumar, en la hoja 2 realiza lo que estableci para Sumar en VBA, la complicacion la tengo cuando en columna B tengo valores alternos y no consigo que me de el resultado en el mismo orden que esta, por ej.
columna A columna B
valores fijos suma
valores fijos suma
valores fijos suma
valores fijos resta
valores fijos resta
valores fijos dividir
valores fijos multiplica
valores fijos suma

el resultado que quiero obtener en el mismo orden, claro que si ahi valores como por ej los primeros 3 que son iguales, tambien para resta los siguientes 2, agruparlos en 1 sola fila, y continuar haciendo con el resto
agradezco su ayuda

hector dijo...

saludos a todos y ati marco que se ve que sabes como un berraco mira no tengo experiencia en programacion pero a tropesones he creado entre comillas un "programa" en excel a base de formulas para control de prestamos gota gota que se manejan en mi pais bueno yo ya cree para cada cliente una hoja y un listado en total son 110 hojas y un listado en las hojas de clientes van nombre tel etc pero ademas llevo saldo abono canceladas fecha de abono atrazo ademas le tengo recibos pero mi problema es que no se como hacer para que lo que yo haga en el listado pegarlo en cada una de las hojas y celdas que quiero que queden ejemplo en el listado esta el nombre del cliente el saldo y se llena el abono del dia quiero que lo que yo escriba en la celda d5 del listado lleqgue al f10 de la hoja1 y lo que escriba enb la d6 del listado llegue a la hoja f11 y asi susesiva mente gracias por su atencion

anapandita dijo...

Hola quisiera saber si hay una manera de ayudarme con mi problema, bueno se trata de varios libros excel que me llegan, es decir uno por dia y cada libro tiene una informacion de 20000 lineas y casi todas son diferentes, lo que estaba intentando hacer es en un libro excel que tiene una sola hoja exportarlo a access y llamarlo base de datos historico y quiero crear una macro la cual los otros libros excel se adjunten a esta base de datos en access y se genere un historial de todos los archivos excel y que se vea por fecha sea semanal, mensual o diario,todos los libros excel tienen los mismos campos bueno espero ke me haya explicado bien gracias por su ayuda

Cristian Garcia dijo...

hola:

Tengo un problema con un libro que se actualiza dia a dia con un codigo diferente y yo tengo una base en donde lo que busco es copiar los nuevos codigos generados del dia anterior, me puedes ayudar con la macro por fa me ayudarias mucho

saludos

Ruben Huamani dijo...

Ruben dice:

Hola. espero alguien pueda ayudarme pues estoy en proceso de aprendizaje, tengo un formulario por donde ingreso informacion, encontre una dificultad, pues existen codigos repetidos, desearia en este mismo formulario evitar el ingreso de codigos repetidos en la cual me muestre un mensaje "existe el codigo", gracias.