Hoy voy a tratar un tema que, aunque pueda parecer menor, no es la primera vez que me lo encuentro cuando realizo trabajos o informes.
El problema surge cuando trabajamos con datos de una tabla dinámica que han sido pegados en una hoja como valores y es necesario rellenar las filas en blanco con el dato de la celda superior que contenga información.
Un ejemplo podría ser este:
Es decir, en aquellas celdas que se encuentran en blanco rellenarlas con el dato correspondiente, licenciado, diplomado, etc.
Para hacer este trabajo, podemos hacerlo o bien con macros o bien utilizando funciones de la hoja Excel.
Si queremos hacerlo manualmente con funciones: nos posicionamos en una celda de la columna que contiene las celdas en blanco, a continuación, (sin dejar de seleccionar la celda), vamos a la pestaña de INICIO > BUSCAR Y SELECCIONAR > IR A ESPECIAL:
y marcamos la opción «Celdas en Blanco«:
Ahora que tenemos las celdas en blanco seleccionadas, (y deben seguir seleccionadas):
Nos situamos en la barra de fórmulas y tecleamos =A2 que se corresponde con la última fila con datos y pulsamos CONTROL + INTRO.
El resultado es el siguiente:
Pero si por alguna razón necesitamos realizar esta tarea con una macro, por ejemplo para automatizar un proceso, lo podemos hacer con dos métodos diferentes, que en realidad hacen lo mismo.
La primera macro (METODO1) realiza los mismos pasos que hemos hecho manualmente, y además deja los datos como valores, sin la fórmula:
Sub Metodo1()
'Defininimos variables
Dim Fin%, x%, Rng%
With Sheets("Hoja1")
'Grabamos longitud del rango y contamos celdas en blanco
Fin = Application.CountA(.Range("B:B"))
x = WorksheetFunction.CountBlank(Range("A2:A" & Fin))
'Si hay celdas en blanco
If x > 0 Then
'Seleccionamos celdas en blanco
.Range("A2:A" & Fin).SpecialCells(xlCellTypeBlanks).Select
'Aplicamos fórmula en cada celda, hace referencia al valor anterior
Selection.FormulaR1C1 = "=R[-1]C"
'Seleccionamos todo el rango y lo pasamos a valores
Rng = Application.CountA(.Range("A:A"))
.Range("A2:A" & Rng).Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
End If
End With
End Sub
La segunda macro (METODO2) es mucho más sencilla y realiza el trabajo mediante un loop haciendo referencia a la última celda con datos:
Sub Metodo2()
'Definimos variables
Dim i%, Fin%
With Sheets("Hoja2")
Fin = Application.CountA(.Range("B:B"))
'Mediante un bucle indicamos que si una celda está vacía
'el valor sea el de la celda anterior.
For i = 2 To Fin
If .Cells(i, 1) = "" Then .Cells(i, 1) = .Cells(i - 1, 1)
Next
End With
End Sub
Con las dos códigos obtendremos el mismo resultado. También debemos tener en cuenta la primera opción (manual) que para casos concretos es la más rápida y eficaz.
Descarga el archivo de ejemplo pulsando en: RELLENAR RANGO DE CELDAS VACÍAS CON EL VALOR DE LA CELDA SUPERIOR
Buen truco no lo sabia
Buena idea, pero hay algo muy sencillo, Ponemos filtros en la fila 1 y en la celda A3 ponemos =A2, copiamos esa celda y filtramos la columna A por celdas vacias, pegamos en el resto de las celdas de la columna A y desfiltramos, si queremos conservar esos datos fijos , simplemente seleccionamos la columna A, copiamos y pegamos especial valor.
Hola Ignacio:
Efectivamente, otro método más para realizar el trabajo de forma rápida 🙂
Gracias por la aportación!
Saludos 🙂
Justo lo que estaba buscanco, Gracias mil SEgu, esto lo acabo de preguntar en otro post tuyo; y en hora buena, lo empiezo a adecuar a mi archivo de revisión y concentracion de datos, Saludos!!
Ok, gracias.
Saludos
Gracias Master, me sacaste de un trabajo innecesario
Gracias!! saludos