3 agosto, 2026

CÓMO OBTENER EL ÚLTIMO VALOR NO VACÍO EN CADA FILA (VBA Y FÓRMULA)

¡Hola a todos!

Cuando trabajáis con datos en Excel, es común encontrar filas donde los valores no siempre están completos. Ya sea en reportes, estructuras jerárquicas o cualquier conjunto de datos, a menudo es necesario identificar el último valor no vacío en cada fila para facilitar el análisis y la presentación de la información.

Hoy os mostraré dos métodos eficientes para lograr esto:
Una macro en VBA que automatiza el proceso para grandes volúmenes de datos.
Una fórmula en Excel que lo hace sin necesidad de programar.

Imaginemos que trabajáis con la estructura organizativa de una empresa en Excel donde cada empleado tiene asignados diferentes niveles dentro de la empresa. La tabla tiene la siguiente distribución:

Nombre y ApellidoNivel 1Nivel 2Nivel 3Nivel 4
María GarcíaDirección GeneralDepartamento de Tecnología
David VegaDirección GeneralDepartamento FinancieroContabilidadCuentas por Pagar
Patricia OrtegaDirección GeneralDepartamento de Marketing
Javier RodríguezDirección GeneralDepartamento de TecnologíaDesarrollo de SoftwareBackend
José PérezDirección GeneralDepartamento FinancieroContabilidadCuentas por Cobrar

El objetivo es obtener el último valor no vacío en cada fila y colocarlo en la columna G.

Si queréis automatizar este proceso en archivos con muchos registros, podéis usar la siguiente macro en VBA:

Sub UltimoDepartamento()
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim i As Long, j As Long
    Set miHoja = ActiveSheet
    ' Encontrar la última fila con datos en la columna A
    lastRow = miHoja.Cells(miHoja.Rows.Count, 1).End(xlUp).Row
    ' Recorrer cada fila para encontrar el último departamento
    For i = 2 To lastRow
        ' Recorremos las columnas de forma inversa y obtenemos el primero con valor
        For j = 6 To 3 Step -1
            If miHoja.Cells(i, j).Value <> "" Then
                miHoja.Cells(i, 7).Value = miHoja.Cells(i, j).Value
                Exit For
            End If
        Next j
    Next i
End Sub

Si preferís una solución sin programación, podéis usar esta fórmula en la columna H:

=BUSCAR(2;1/(C2:E2<>"");C2:E2)

La fórmula se explica así:

C2:E2<>"" Creamos una matriz de valores VERDADERO (1) para celdas no vacías y FALSO (0) para vacías.

1/(C2:E2<>"") = Convertimos VERDADERO en 1 y FALSO en error.

BUSCAR(2;1/(C2:E2<>"");C2:E2) = Buscamos el valor 2, que no existe, y selecciona el último 1 en la matriz, devolviendo el último valor no vacío.

Y así obtendremos:

Cómo podéis ver, tanto el código como la fórmula muestran el mismo resultado. Depende la circunstancia específica en la que os encontréis podréis utilizar una u otra alternativa.

Y, que siempre lo comento, este es un post de Excel, con VBA o fórmula, no es Power Query ni Python, donde por supuesto se puede hacer este mismo ejercicio con sus propias funciones, ejemplo, en Query bastaría con usar en una columna personalizada:

List.Last(List.RemoveNulls(Record.ToList(_)))

Donde convertimos toda la fila en una lista: Record.ToList(_) y luego eliminamos los vacíos List.RemoveNulls() y mostramos resultado: List.Last(…).

Pero si en lugar de un vacío, tenemos, por ejemplo un cero. Estas serían las soluciones, para la macro:

Sub UltimoDepartamento_2()
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim i As Long, j As Long
    Set miHoja = ActiveSheet
    ' Encontrar la última fila con datos en la columna A
    lastRow = miHoja.Cells(miHoja.Rows.Count, 1).End(xlUp).Row
    ' Recorremos las columnas de forma inversa para encontrar el último valor no vacío y distinto de 0
    For i = 2 To lastRow
        For j = 6 To 3 Step -1
            If miHoja.Cells(i, j).Value <> "" And miHoja.Cells(i, j).Value <> 0 Then
                miHoja.Cells(i, 7).Value = miHoja.Cells(i, j).Value
                Exit For
            End If
        Next j
    Next i
End Sub



Y para la fórmula ya no podemos usar Buscar ya que no maneja condiciones múltiples, así que tendremos que usar esta matricial:

Con esta parte creamos una matriz: (C2:E2<>»»)*(C2:E2<>0) y con esta: COLUMNA(C2:E2)-COLUMNA(C2)+1 convertimos las columnas en índices y al aplicar MAX() obtenemos la última celda vacía y con INDICE(C2:E2, MAX(…)) recuperamos el último valor válido.

=INDICE(C2:E2, MAX(SI((C2:E2<>"")*(C2:E2<>0), COLUMNA(C2:E2)-COLUMNA(C2)+1)))

Y para el caso de Query:

List.Last(List.Select(Record.ToList(_), each _ <> null and _ <> 0))

Y esto es todo, espero que sea de utilidad!!

Comparte este post

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies