David tiene una hoja de trabajo que incluye solo dos columnas: una fecha y un valor de cartera para cada fecha. La hoja de trabajo tiene filas para cada día de negociación desde enero de 1999 hasta el presente. David necesita eliminar todas las filas excepto las que corresponden al último día de negociación de cada mes. Intentó filtrar, pero eso no ayudó, por lo que está confundido sobre la mejor manera de eliminar las filas innecesarias.

Al proporcionar formas de abordar este problema, una de las claves de la pregunta en la que me voy a centrar es que David dijo que sus datos «tienen filas para cada día de operaciones». Para mí, esto significa que algunas fechas (días no comerciales) no están incluidas en sus datos. Esto es clave porque significa que no tenemos que encontrar una solución que, antes de decidir si mantener una fila o no, determina si una fecha es un día de negociación.

De hecho, esto facilita mucho el trabajo. Ahora podemos simplemente encontrar, a partir de las fechas de la columna A, aquellas filas que realmente contienen la última (o «más alta») fecha en un mes determinado. Me centraré primero en un enfoque manual que se basa en una columna de ayuda. Dado que David dijo que sus datos constan solo de las columnas A (fecha) y B (valor), sugeriré usar la columna C como columna auxiliar. (También voy a suponer que la fila 1 tiene encabezados de columna y los datos reales comienzan en la fila 2.)

Asegurándose de que sus datos estén ordenados de modo que las fechas estén en orden ascendente, coloque la siguiente fórmula en la celda C2:

=IF(DAY(A3)<DAY(A2),"EOM","X")

Copie esta fórmula para todos sus datos, y básicamente habrá terminado. Ahora puede, si lo desea, usar el filtrado basado en la columna C. Si filtra de modo que solo se muestren las filas que contienen «EOM», entonces tiene sus valores finales para cada mes. Si filtra de modo que solo se muestren las filas que contienen «X», entonces podría eliminar esas filas, quitar el filtro y tener solo filas con los valores de fin de mes en sus datos.

Como suele ser el caso, hay una gran cantidad de fórmulas que podría usar en la columna C en lugar de la que sugiero. Sin embargo, sugerí este porque hace una comparación muy simple que siempre será comprobable: si el día «cae» en valor en la fila siguiente al actual. En todos los escenarios posibles, esto solo será cierto al final de un mes. Entonces, esa fila está marcada con «EOM» y el resto con «X».

Debo señalar que si elige usar una fórmula diferente, asegúrese de que sea una que no pruebe si la fecha en la columna A es el último día del mes. ¿Por qué? Porque puede que no sea así: recuerde que en los datos de David, la columna A contiene las fechas de los días de negociación y es muy posible que el último día de negociación de un mes no sea el último día del mes. (Los fines de semana y días festivos, en otras palabras, están excluidos, por definición, de los datos de David).

Si está utilizando Office 365 (o lo que Microsoft, en estos días, se refiere como Microsoft 365), también hay una forma de extraer solo las fechas de fin de mes y sus valores. Supongamos que sus datos están en A2: B5000. (Recuerde que A1: B1 contiene encabezados de columna). Coloque la siguiente fórmula en la celda E2:

=FILTER(A2:B5000,DAY(A3:A5001)<DAY(A2:A5000),1)

Eso es; una sola fórmula en una sola celda. Puede que tenga que formatear la columna E para mostrar las fechas correctamente, pero este uso de la función FILTRO hace la misma comparación ya discutida y extrae solo las fechas y valores de fin de mes. (Esto es bastante hábil, si lo piensa bien). Recuerde, sin embargo, que solo funcionará en Office 365; no funcionará en Excel 2019, Excel 2016 o cualquier versión anterior del programa.

Si prefiere un enfoque basado en macros, entonces el siguiente macro breve funcionará:

Sub DelRows()

Dim LastRow As Long     Dim J As Long

LastRow = Cells(Rows.Count, "A").End(xlUp).Row     LastRow = LastRow - 1     For J = LastRow To 2 Step -1         If Month(Cells(J, 1)) = Month(Cells(J + 1, 1)) Then             Rows(J).EntireRow.Delete         End If     Next J End Sub

La macro determina la última fila en la hoja de trabajo (almacenada en la variable LastRow) y luego usa un bucle For …​ Next para recorrer las filas hacia atrás. Si el mes de la fila actual es igual al mes de la fila siguiente, la fila se elimina. Tenga en cuenta que la macro disminuye LastRow antes de saltar al bucle For …​ Next. Esto se hace porque se asume que la última fila de datos siempre será el último día de negociación de sus datos, por lo que siempre se queda con los datos reducidos.

Esta macro puede tardar en ejecutarse, ya que elimina la mayoría de las filas de la hoja de trabajo, una por una. Sin embargo, cuando esté completo, solo le quedarán los datos de fin de mes.

Una nota final: los enfoques utilizados en esta sugerencia son, con la excepción de la función FILTRO, destructivos de sus datos. Cuando los use, los datos de su hoja de trabajo se perderán para siempre. Esto significa que debe pensarlo dos veces (o tres veces) antes de ejecutarlos en cualquier cosa que no sea una copia de sus datos originales.

_Nota: _

Si desea saber cómo usar las macros descritas en esta página (o en cualquier otra página de los sitios ExcelTips), he preparado una página especial que incluye información útil.

link: / excelribbon-ExcelTipsMacros [Haga clic aquí para abrir esa página especial en una nueva pestaña del navegador].

ExcelTips es su fuente de formación rentable en Microsoft Excel.

Este consejo (13768) se aplica a Microsoft Excel 2007, 2010, 2013, 2016, 2019 y Excel en Office 365.