Consulta sobre macro para completar celdas vacías

Buenos días, antes que nada me presento, me llamo Leandro y soy de bs as. Me estoy interiorizando en el mundo de macros y VB.
En esta oportunidad se me presentó un problema el cual seguro que ustedes podrán ayudarme.
Resulta que tengo 6 columnas con el mismo tipo de datos en todas las celdas (numéricos). El problema que tengo es que de las 6 columnas hay varias que están vacías, por ejemplo:
En A1 tengo un valor, en B1 celda vacía, en C1 un valor, en D1 vacía, etc
Lo que necesito es completar las primeras columnas sustituyendo los datos de las otras que están con valores (la idea es dejar lleno las primeras columnas y en las ultimas los espacio vacíos)
Esto lo tengo que hacer para 40mil filas (el cual varían las posiciones de las celdas vacías y rellenas) y me gustaría crear una macro que me lo haga solo.
Desde ya les agradezco mucho su ayuda. Saludos

1 Respuesta

Respuesta
1
Prueba esto
En un modulo pones:
Sub ordena()
Dim i As Long
Dim c As Integer
c = 1
For i = 1 To 10
If Cells(i, c) = "" Then Cells(i, c) = Cells(i, c + 1): Cells(i, c + 1) = ""
If Cells(i, c + 1) = "" Then Cells(i, c + 1) = Cells(i, c + 2): Cells(i, c + 2) = ""
If Cells(i, c + 2) = "" Then Cells(i, c + 2) = Cells(i, c + 3): Cells(i, c + 3) = ""
If Cells(i, c + 3) = "" Then Cells(i, c + 3) = Cells(i, c + 4): Cells(i, c + 4) = ""
c = 1
DoEvents
Next
End Sub
Se llama ordena, consider las columnas desde A hasta E
Si tienes más columnas agrega lineas al macro siguiendo la misma lógica, en donde C es columna=1 + n que es el numero de desplazamientos hacia la derecha
Lo invocas como cualquier macro ALT+F8
Al pasar el macro la primera vez seguro te quedaran celdas vacías en A, debes seguir corriéndolo hasta que las celdas en A sean nulas
Es como apretar varias veces un botón.
Mil gracias por la ayuda, lo probé y funciona, lo único malo es que cuando hago las pasadas me genera una nueva columna que copia los valores de la ultima columna y empieza a repetir los valores. ¿Hay alguna posibilidad de que no genere esa nueva columna o en todo caso que la genere y a la vez la borre?
Estoy muy agradecido. Saludos
¿Genera una nueva columna?... ¿Extraño pues lo que hace es solo jalar celdas de derecha a izquierda?.
Habría que probar otro enfoque... dime cual es el rango completo de tus datos, desde que columna hasta que columna debe recorrer. Mejor probare con un bucle recorriendo celda a celda. Y así lo corres solo una vez.
Yo tengo que hacer la pasada de la A a la F y son 40000 filas o más. Cuando hago las pasadas me genera en la columna G una copia del ultimo dato de las 6 columnas.
Lo que hice fue hacer una pasada, borrar la columna G y tiro la segunda pasada, vuelvo a borrar la columna G y así sucesivamente hasta terminar. Haciendo esto funciona, pero estaría bueno que no genere esa séptima columna.
Nuevamente muchísimas gracias
Ahora realize un bucle que recorrerá las 6 primeras columnas por todas las celdas según n filas que tu indiques. En un imputbox
Insertara una nueva hoja al final de las que tu tienes y volcara los datos ordenados en esta nueva hoja
Al finalizar te mosrara un mensaje indicando que ha terminado y el nombre de la hoja en que están los datos ordenados.
En tu proyecto iserta un modulo y allí pones esto:
Sub ordenar()
Dim i As Long
Dim col As Integer
Dim total As Long
Dim c As Integer
Dim origen As Integer
'by calvuch 08072011
'jala celdas no vacias de derecha a izquierda en nueva hoja
If Application.WorksheetFunction.CountA(Range("A:A")) = 0 Then Exit Sub
On Local Error GoTo errores
total = InputBox("cuantas filas", "cuantas filas recorreras ?", 1)
col = 1
origen = ActiveSheet.Index
'crea nueva hoja en donde desplegara datos ordenados
Sheets.Add After:=Sheets(Sheets.Count)
Sheets(origen).Select
'recorremos los datos
For i = 1 To total
For c = 1 To 6
If Len(Cells(i, c)) > 0 Then
Sheets(Sheets.Count).Cells(i, col) = Cells(i, c)
col = (col + 1)
End If
Next
col = 1
DoEvents
Next
MsgBox "Terminado - los datos estan ordenados en la : " & Sheets(Sheets.Count).Name, vbInformation
i = 0: col = 0: total = 0: c = 0: origen = 0
errores:
If Err.Number = 13 Then Exit Sub
End Sub
El macro se llama ordenar, lo llamas con ALT + F8 lo primero que te preguntara es cuantas filas deseas recorres.
Pues bien allí indicas el numero de la ultima fila que tiene datos y luego aceptas,
Como son muchas filas y no se que tan potente es tu maquina no se cuanto tardara pero espera a que finalice ( espera el mensaje).
De ma esta decirte que primero esto lo pruebes en una copia del libro original.
Me comentas que tal te fue con esto.
Nota, si necesitas abarcar más que 6 columnas solo cambia el numero en esta linea
For c = 1 To 6 ' en donde 6 es el tope de columnas que abarcara
Otra cosa, si en columna A no hay datos el macro no correrá, pues entiende que no hay nada que recorrer. Debe tener al menos un dato.
Demás esta decir que CIERRES la pregunta al finalizar la evaluación
bye

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas