RELLENAR RANGO DE CELDAS VACÍAS CON EL VALOR DE LA CELDA SUPERIOR

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:

RELLENAR RANGO DE CELDAS VACÍAS CON EL VALOR DE LA CELDA SUPERIOR

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:

RELLENAR RANGO DE CELDAS VACÍAS CON EL VALOR DE LA CELDA SUPERIOR2

y marcamos la opción “Celdas en Blanco“:

RELLENAR RANGO DE CELDAS VACÍAS CON EL VALOR DE LA CELDA SUPERIOR3

Ahora que tenemos las celdas en blanco seleccionadas, (y deben seguir seleccionadas):

RELLENAR RANGO DE CELDAS VACÍAS CON EL VALOR DE LA CELDA SUPERIOR4

Nos situamos en la barra de fórmulas y tecleamos =A2 que se corresponde con la última fila con datos y pulsamos CONTROL + INTRO.

RELLENAR RANGO DE CELDAS VACÍAS CON EL VALOR DE LA CELDA SUPERIOR5

El resultado es el siguiente:

RELLENAR RANGO DE CELDAS VACÍAS CON EL VALOR DE LA CELDA SUPERIOR6

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

Anuncios

SEGMENTAR EL CONTENIDO DE UNA CELDA

Hola a todos 🙂

Qué tal estáis?, espero que bien!. Esta semana he tenido varias consultas, algunas han sido bastante complejas y otras interesante por lo extraño de lo que me pedían. Una de ellas es el motivo de este post.

Y como digo en el título, lo que me pedían era poder segmentar una serie de contenidos (numéricos) de varias celdas e ir colocando cada uno de los números en la siguiente celda, por ejemplo imaginad que tenéis en una celda la siguiente cifra:
“10000” y se pide segmentar este número (incluidos los ceros) en las siguientes celdas a la derecha, es decir:

segmentar-el-contenido-de-una-celda

Aunque desconozco la finalidad de este trabajo y no logro identificar su utilidad, está claro que para ese lector sí era importante. Así que desarrollé un pequeño proceso para automatizarlo. Esta es la macro:

Sub SEGMENTAR()
'Definimos variables
Dim i As Integer, j As Integer, n As Integer
Dim sDat As String, fin As Double
With Sheets("SEGMENTAR")
'contamos el rango de los contenidos a segmentar
fin = Application.CountA(.Range("A:A"))
'iniciamos el primer bucle para seleccionar cada contenido
For n = 2 To fin
'iniciamos un segundo bucle que cuente y extraiga cada parte del contenido de la celda
For i = Len(.Cells(n, 1)) To 1 Step -1
sDat = Mid(.Cells(n, 1), i, 1)
'iniciamos un tercer bucle para colocar el segmento extraido en la celda a la derecha
For j = 1 To i
.Cells(n, j + 1) = sDat
Next j
Next i
Next n
End With
End Sub

Y una vez que aplicamos el código a las celdas de la columna “A”, segmentaremos cada uno de los contenidos.

Este es un ejemplo:

segmentar-el-contenido-de-una-celda1

Lógicamente funciona tanto con datos numéricos como con datos alfanuméricos. En este ejemplo, he tenido que transformar los datos numéricos en texto a partir de la cifra en “A12”, de lo contrario el dato se mostraría en notación científica (a partir de cifras mayores o iguales a 12 dígitos) y no quedaría muy estético (podéis echar un vistazo a los límites de Excel).

Este ha sido el post de hoy y como me ha parecido interesante lo comparto con todos vosotros 🙂

Descarga el archivo pulsando en: SEGMENTAR EL CONTENIDO DE UNA CELDA